Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 21 do total)
  • Autor
    Posts
  • #91121
    Girino
    Participante

      Olá, Bom Dia..!! 8)

      A minha dúvida é a seguinte: 🙄

      No SQL Server tenho uma procedure que funciona da seguinte maneira:

      CREATE PROCEDURE TESTE
      @PAR1 VARCHAR(4)
      AS
      SELECT *FROM TABELA
      WHERE CODIGO = @PAR1

      Quando eu executo esta procedure, ela me retorna todos os campos da minha tabela pelo código informado pelo parâmetro, como se fosse um select.

      A chamada da Procedure eu faço assim:

      EXEC TESTE (‘0025’)

      ___________________________________________________________________________________________________________________

      Gostaria muito de um exemplo de como fazer a mesma procedure, porém para o Banco de Dados ORACLE.
      Já pesquisei em outros Fóruns também e na net, mas não obtive resposta.
      Se alguém souber e puder ajudar, agradeço desde já.

      Preciso da Procedure e do Comando de chamada da mesma. 😉

      #91122
      MauroLacerda
      Participante

        CREATE OR REPLACE PROCEDURE Teste (p_par IN NUMBER)
        IS
        CURSOR tabela is select emp_codigo from tabela where emp_codigo=p_par;
        v_codigo number(6);
        BEGIN
        OPEN tabela;
        LOOP
        FETCH tabela INTO v_codigo;
        EXIT WHEN tabela%NOTFOUND;
        BEGIN
        DBMS_OUTPUT.PUT_LINE(v_codigo);

            END;
          END LOOP;
        

        END;

        exec teste(x);

        #91123
        MauroLacerda
        Participante

          CREATE OR REPLACE PROCEDURE Teste (p_par IN NUMBER)
          IS
          CURSOR tabela is select emp_codigo from tabela where emp_codigo=p_par;
          v_codigo number(6);
          BEGIN
          OPEN tabela;
          LOOP
          FETCH tabela INTO v_codigo;
          EXIT WHEN tabela%NOTFOUND;
          BEGIN
          DBMS_OUTPUT.PUT_LINE(v_codigo);

              END;
            END LOOP;
          

          END;

          exec teste(x);

          #91125
          Girino
          Participante

            Olá..!! 8)

            Fiz conforme você me passou. Consegui compilar a procedure, porém da erro qdo eu vou executá-la.

            CREATE OR REPLACE PROCEDURE teste3 (p_par IN VARCHAR2)
            IS
            CURSOR APONTAMENTO is select CODCC_R from APONTAMENTO where CODCC_R = p_par;
            v_codigo VARCHAR2( 8 );
            BEGIN
            OPEN APONTAMENTO;
            LOOP
            FETCH APONTAMENTO INTO v_codigo;
            EXIT WHEN APONTAMENTO%NOTFOUND;
            BEGIN
            DBMS_OUTPUT.PUT_LINE(v_codigo);
            END;
            END LOOP;
            END;

            exec teste3(‘02210002’);

            ORA-00900: instrução SQL inválida

            Onde estou errando..??? 🙄

            Muito Obrigado pela atenção..!!

            #91126
            MauroLacerda
            Participante

              Faz assim:

              Show error

              E veja os privilegios do usuario tambem.

              #91127
              MauroLacerda
              Participante

                Configure os privilegios do usuario para “CREATE PROCEDURE”

                #91128
                Girino
                Participante

                  OLÁ..!!

                  Se eu executar este comando show erro da o mesmo erro:

                  ORA-00900: instrução SQL inválida

                  Estou tentando rodar no editor de comandos SQL do ORACLE XE.
                  Será que é por isso?

                  Mas fiz o teste com 2 funções que tenho aqui e rodou normal..!!

                  #91129
                  fsitja
                  Participante

                    No Oracle você precisaria declarar um parâmetro de saída na procedure
                    ou usar uma function. Há pelo menos duas alternativas:

                    1 – Usar um ref cursor para retornar um resultset para o client, ou aplicação
                    que chamou a procedure. O chamador vai fazer o “fetch” dos dados e
                    usá-los como precisar. É retornada apenas uma referência (“ponteiro”),
                    mais flexível e consome menos recursos do que a alternativa 2.

                    2 – Retornar uma nested table / varray / associative array (index-by
                    table). Nesse caso você precisa criar um type do tipo necessário, dar o
                    fetch na table e retornar a estrutura em memória, pronta para ser usada.
                    Vai, por consequência, utilizar mais memória e não é recomendado se o
                    seu retorno tiver muitas milhares de linhas.

                    Pode-se usar uma function no lugar da procedure também, pois ela
                    retorna dados sem precisar de parâmetro OUT. Peguei um exemplo que
                    eu tinha feito outro dia para pipelined table function, um pouco mais
                    complexo, mas que conceitualmente serve para a mesma coisa. Testei
                    usando a view v$version, substitua pela sua tabela.

                    Abraços,
                    Francisco.

                    #91130
                    Girino
                    Participante

                      Vejam:

                      [url=http://img230.imageshack.us/i/erroya.jpg/:3ibsgvl0]

                      abraços..!! 😀

                      Renato 😥

                      #91131
                      fsitja
                      Participante

                        Edit: continuando mensagem acima

                        1

                        CREATE OR REPLACE PROCEDURE
                        test_ref(cur_output OUT sys_refcursor) IS
                        BEGIN
                        OPEN cur_output FOR
                        WITH teste AS
                        (SELECT 1 num FROM dual)
                        SELECT num
                        FROM teste;
                        END;

                        2

                        CREATE OR REPLACE PACKAGE pk_type AS
                        TYPE t_tab IS TABLE OF v$version%rowtype;
                        END pk_type;

                        CREATE OR REPLACE FUNCTION sp_test return pk_type.t_tab
                        PIPELINED IS
                        v_saida pk_type.t_tab;
                        v_refcur SYS_REFCURSOR;
                        BEGIN
                        OPEN v_refcur FOR
                        SELECT * from v$version;
                        FETCH v_refcur BULK COLLECT
                        INTO v_saida;
                        close v_refcur;
                        for i in 1 .. v_saida.count
                        loop
                        PIPE ROW(v_saida(i));
                        end loop;
                        END sp_test;

                        select * from table(sp_test)

                        #91134
                        MauroLacerda
                        Participante

                          vEJA O PRIVILEGIO.

                          Configure os privilegios do usuario para “CREATE PROCEDURE”

                          #91135
                          Girino
                          Participante

                            Olá..!! 8)

                            Este usuário já está com privilégios de “DBA” 😉

                            #91136
                            fsitja
                            Participante

                              [quote=”Girino”:28r9z3on]Olá..!! 8)

                              Este usuário já está com privilégios de “DBA” 😉 [/quote]

                              Você não está no console, então tenta o seguinte…


                              BEGIN
                              teste3('02210002');
                              END;

                              #91139
                              burga
                              Participante

                                [quote=”Girino”:3vfg6x9j]Olá..!! 8)

                                Fiz conforme você me passou. Consegui compilar a procedure, porém da erro qdo eu vou executá-la.

                                CREATE OR REPLACE PROCEDURE teste3 (p_par IN VARCHAR2)
                                IS
                                CURSOR APONTAMENTO is select CODCC_R from APONTAMENTO where CODCC_R = p_par;
                                v_codigo VARCHAR2( 8 );
                                BEGIN
                                OPEN APONTAMENTO;
                                LOOP
                                FETCH APONTAMENTO INTO v_codigo;
                                EXIT WHEN APONTAMENTO%NOTFOUND;
                                BEGIN
                                DBMS_OUTPUT.PUT_LINE(v_codigo);
                                END;
                                END LOOP;
                                END;

                                exec teste3(‘02210002’);

                                ORA-00900: instrução SQL inválida

                                Onde estou errando..??? 🙄

                                Muito Obrigado pela atenção..!![/quote]

                                Você precisa passar o p_par como parâmetro pro cursor.
                                Não pode passar direto…

                                O cursor ficaria assim:

                                CURSOR APONTAMENTO (p_parametro IN VARCHAR2) is select CODCC_R from APONTAMENTO where CODCC_R = p_parametro;

                                e pra abrir o cursor:

                                OPEN APONTAMENTO(p_par);

                                #91141
                                Girino
                                Participante

                                  Olá.. 8)

                                  Dessa maneira executou..!! 😀

                                  Como transformar o meu primeiro exemplo agora..

                                  Tentei conforme foi passado mas não consegui..!! 🙄 🙄

                                  Será possível??? 🙄 🙄

                                  Muuito Obrigado..!!

                                Visualizando 15 posts - 1 até 15 (de 21 do total)
                                • Você deve fazer login para responder a este tópico.