Pular para o conteúdo
  • Este tópico contém 14 respostas, 4 vozes e foi atualizado pela última vez 18 anos, 1 mês atrás por Anônimo.
Visualizando 15 posts - 1 até 15 (de 15 do total)
  • Autor
    Posts
  • #78025
    Anônimo

      Olá, amigos. Poderiam me dar uma dica de como executar esta procedure no SQL PLUS e retornar todos os dados? Obrigado!

      CREATE OR REPLACE PROCEDURE P_BUSCA_DEPTO(
      V_CODIGO OUT DEPARTAMENTO.CODIGO%TYPE,
      V_NOME OUT DEPARTAMENTO.NOME%TYPE,
      V_COD_REGIAO OUT DEPARTAMENTO.COD_REGIAO%TYPE)
      IS
      CURSOR C_DEPTO IS
      SELECT CODIGO, NOME, COD_REGIAO FROM DEPARTAMENTO;
      BEGIN
      OPEN C_DEPTO;
      LOOP
      FETCH C_DEPTO INTO
      V_CODIGO, V_NOME, V_COD_REGIAO;

      EXIT WHEN C_DEPTO%NOTFOUND;
      END LOOP;
      CLOSE C_DEPTO;
      END;
      /

      #78048
      chduarte
      Participante

        Se voce precisa imprimir o resultado desta procedure na console do SQL*Plus faca o seguinte:

        SQL> set serveroutput on

        SQL> CREATE OR REPLACE PROCEDURE P_BUSCA_DEPTO(
        V_CODIGO OUT DEPARTAMENTO.CODIGO%TYPE,
        V_NOME OUT DEPARTAMENTO.NOME%TYPE,
        V_COD_REGIAO OUT DEPARTAMENTO.COD_REGIAO%TYPE)
        IS
        CURSOR C_DEPTO IS
        SELECT CODIGO, NOME, COD_REGIAO FROM DEPARTAMENTO;
        BEGIN
        OPEN C_DEPTO;
        LOOP
        FETCH C_DEPTO INTO
        V_CODIGO, V_NOME, V_COD_REGIAO;

        ———- ALTERACAO NA PROCEDURE PARA IMPRESSAO ————–

        DBMS_OUTPUT.PUT_LINE(‘Codigo: ‘||v_codigo);
        DBMS_OUTPUT.PUT_LINE(‘Nome: ‘||v_nome);

        ———- ALTERACAO NA PROCEDURE PARA IMPRESSAO ————–

        EXIT WHEN C_DEPTO%NOTFOUND;
        END LOOP;
        CLOSE C_DEPTO;
        END;
        /

        SQL> exec P_BUSCA_DEPTO

        ou

        SQL> begin P_BUSCA_DEPTO; end;
        /

        []

        #78050
        CJones
        Participante

          Voce pode tentar o seguinte :

          DECLARE
          V_TST_COD NUMBER;
          V_TST_NOME VARCHAR2(100);
          V_TST_COD_REG NUMBER;
          BEGIN
          P_BUSCA_DEPTO ( V_TST_COD
          , V_TST_NOME

          , V_TST_COD_REG);

          DBMS_OUTPUT.PUT_LINE (‘V_TST_COD : ‘ || V_TST_COD );
          DBMS_OUTPUT.PUT_LINE (‘V_TST_NOME : ‘ || V_TST_NOME );

          DBMS_OUTPUT.PUT_LINE (‘V_TST_COD_REG : ‘|| V_TST_COD_REG);

          END;
          /

          Espero ter ajudado.

          Grande [].

          #78052
          Fontalva
          Participante

            Apenas um comentário,

            esta procedure que voce esta querendo criar, não tem o menor sentido…Voce criou uma procedure que retorna todos os registros de uma tabela? Concorda que seria melhor fazer um simples select “FULL” ?

            Ou então criar sim a procedure, mas sem estes parametros OUT que não fazem o menor sentido. Para ver todos os registros da tabela departamento, ou melhor, para trazer todos os registro de qualquer tabela o ideal é criar um select simples…Ou uma função que retornasse um array, ou tabela.

            Marcos Fontalva.

            [quote=”mouraca”:3rau69af]Olá, amigos. Poderiam me dar uma dica de como executar esta procedure no SQL PLUS e retornar todos os dados? Obrigado!

            CREATE OR REPLACE PROCEDURE P_BUSCA_DEPTO(
            V_CODIGO OUT DEPARTAMENTO.CODIGO%TYPE,
            V_NOME OUT DEPARTAMENTO.NOME%TYPE,
            V_COD_REGIAO OUT DEPARTAMENTO.COD_REGIAO%TYPE)
            IS
            CURSOR C_DEPTO IS
            SELECT CODIGO, NOME, COD_REGIAO FROM DEPARTAMENTO;
            BEGIN
            OPEN C_DEPTO;
            LOOP
            FETCH C_DEPTO INTO
            V_CODIGO, V_NOME, V_COD_REGIAO;

                   EXIT WHEN C_DEPTO%NOTFOUND;
              END LOOP;
            

            CLOSE C_DEPTO;
            END;
            /[/quote]

            #78064
            Anônimo

              mouraca, me permite uma alteração na sua procedure para que eu possa externar a minha dúvida?
              Suponhamos que a procedure tenha a seguinte estrutura:

              CREATE OR REPLACE PROCEDURE P_BUSCA_DEPTO(
              V_CODIGO OUT DEPARTAMENTO.CODIGO%TYPE,
              CursorSaida OUT CURSOR)
              IS
              BEGIN
              OPEN CursorSaida FOR
              SELECT CODIGO,
              NOME,
              COD_REGIAO
              FROM DEPARTAMENTO
              WHERE CODIGO = V_CODIGO;
              END;
              /

              E agora Marcos Fontalva, preciso executar esta procedure pelo SQL Plus e imprimir
              o resultado deste cursor sem colocar o dbms_output na própria procedure.
              Você pode me ajudar?

              #78066
              Anônimo

                [quote=”lininha”:xe3n3loo]mouraca, me permite uma alteração na sua procedure para que eu possa externar a minha dúvida?
                Suponhamos que a procedure tenha a seguinte estrutura:

                CREATE OR REPLACE PROCEDURE P_BUSCA_DEPTO(
                V_CODIGO OUT DEPARTAMENTO.CODIGO%TYPE,
                CursorSaida OUT CURSOR)
                IS
                BEGIN
                OPEN CursorSaida FOR
                SELECT CODIGO,
                NOME,
                COD_REGIAO
                FROM DEPARTAMENTO
                WHERE CODIGO = V_CODIGO;
                END;
                /

                E agora Marcos Fontalva, preciso executar esta procedure pelo SQL Plus e imprimir
                o resultado deste cursor sem colocar o dbms_output na própria procedure.
                Você pode me ajudar?[/quote]

                Perdão galera… me enganei na declaração da procedure. O parâmetro V_CODIGO é IN e não OUT como coloquei antes. Segue novo código da procedure:
                CREATE OR REPLACE PROCEDURE P_BUSCA_DEPTO(
                V_CODIGO IN DEPARTAMENTO.CODIGO%TYPE,
                CursorSaida OUT CURSOR)
                IS
                BEGIN
                OPEN CursorSaida FOR
                SELECT CODIGO,
                NOME,
                COD_REGIAO
                FROM DEPARTAMENTO
                WHERE CODIGO = V_CODIGO;
                END;
                /

                #78081
                Fontalva
                Participante

                  Essa é uma forma de se fazer isto.

                  — Funciona da seguinte maneira. Cria-se dois objetos no banco. Que servirão para transicionar as informaçoes em
                  — objetos
                  — Em seguida crio uma função que captura os registros e retorna os registros num objeto t_table.
                  — No bloco de teste sera varrida o objeto e demonstrado os registros contidos no objeto.


                  Create Type tp_vector Is Object(CODIGO Number, NOME Varchar2(40), REGIAO Varchar2(20));

                  Create Type t_table Is Varray(20) Of tp_vector

                  Create Or Replace Function testeReturn(p_codigo In Number) Return t_table Is
                  v_table t_table := t_table();
                  v_index Integer := 1;

                  Begin
                  ------- Inserindo dados no Array
                  For x In (SELECT CODIGO, NOME, REGIAO FROM DEPARTAMENTO WHERE CODIGO = P_CODIGO) Loop
                  v_table.Extend;
                  v_table(v_index) := tp_vector(x.codigo,x.nome,x.regiao);
                  v_index := v_index + 1;
                  End Loop;

                  Return v_table;
                  end;

                  ----- Bloco de teste
                  Declare
                  v_table t_table := t_table();
                  Begin
                  v_table := testeReturn(1);
                  v_table.Extend;

                  For x In 1..v_table.Last Loop
                  dbms_output.put_line(v_table(X).regiao);
                  dbms_output.put_line(v_table(X).codigo);
                  dbms_output.put_line(v_table(X).nome);
                  End Loop;
                  End;

                  #78083
                  Anônimo

                    Obrigada Marcos….
                    Infelizmente no meu caso real, a sua solução não seria muito produtiva. A procedure real que estou tentando executar tem 2628 linhas, recebe 21 parâmetros e retorna uns 40…
                    Ai já viu né? Em todo caso obrigada pela atenção.
                    Mas mesmo assim se alguém ainda tiver alguma solução mais transparente ficaria muito grata.
                    Obrigada 🙂

                    #78085
                    Fontalva
                    Participante

                      Me diga uma coisa, esta procedure que voce esta querendo criar servira pra que exatamente?
                      Voce vai inserir os dados em outra tabela, mostrar na tela, como vão ser tratados estes dados? Talvez você dizendo para que ela servirá eu possa te ajudar melhor.

                      [].

                      #78087
                      Anônimo

                        Esta procedure só faz SELECT para consulta. Ela faz um select com diversas tabelas.
                        Criei esta consulta logo abaixo e ela faz exatamente o que eu preciso, ou seja, não é necessário mexer na procedure e nem trazer o select para o código de execução.
                        Mas como a minha procedure é muito grande não seria nada produtivo. Eu até que tentei fazer mas fiquei quase a tarde inteira e acabei desistindo.
                        Se não der para visualizar os dados, pelo menos eu preciso saber se o cursor traz alguma informação ou se está vazio.

                        declare
                        vCODIGO DEPARTAMENTO.CODIGO%TYPE
                        vNOME DEPARTAMENTO.NOME%TYPE
                        vCOD_REGIAO DEPARTAMENTO.COD_REGIAO%TYPE
                        Pcursor CURSOR;

                        begin
                        P_BUSCA_DEPTO(V_CODIGO, Pcursor);
                        LOOP
                        FETCH Pcursor INTO CODIGO, NOME, COD_REGIAO;
                        EXIT WHEN Pcursor %NOTFOUND;
                        dbms_output.put_line(CODIGO || ‘ , ‘ || NOME || ‘ , ‘ || COD_REGIAO);
                        END LOOP;
                        CLOSE Pcursor;

                        end;
                        /

                        Mais uma vez obrigada 🙂

                        #78089
                        Fontalva
                        Participante

                          Este bloco pl/sql que voce colocou, voce não conseguiu roda-lo certo?

                          [quote=”lininha”:3q58cy5g]Esta procedure só faz SELECT para consulta. Ela faz um select com diversas tabelas.
                          Criei esta consulta logo abaixo e ela faz exatamente o que eu preciso, ou seja, não é necessário mexer na procedure e nem trazer o select para o código de execução.
                          Mas como a minha procedure é muito grande não seria nada produtivo. Eu até que tentei fazer mas fiquei quase a tarde inteira e acabei desistindo.
                          Se não der para visualizar os dados, pelo menos eu preciso saber se o cursor traz alguma informação ou se está vazio.

                          declare
                          vCODIGO DEPARTAMENTO.CODIGO%TYPE
                          vNOME DEPARTAMENTO.NOME%TYPE
                          vCOD_REGIAO DEPARTAMENTO.COD_REGIAO%TYPE
                          Pcursor CURSOR;
                          begin
                          P_BUSCA_DEPTO(V_CODIGO, Pcursor); –> V_CODIGO não declarado
                          LOOP
                          FETCH Pcursor INTO CODIGO, NOME, COD_REGIAO; –> nenhuma destas estão declaradas tambem, ou então voce declarou com o nome errado
                          EXIT WHEN Pcursor%NOTFOUND;
                          dbms_output.put_line(CODIGO || ‘ , ‘ || NOME || ‘ , ‘ || COD_REGIAO);
                          END LOOP;
                          CLOSE Pcursor;

                          end;
                          Mais uma vez obrigada 🙂 [/quote]

                          #78092
                          Fontalva
                          Participante

                            A unica maneira que consegui fazer o seu codigo rodar foi a seguinte:

                            Crio uma Package com um tipo dentro REF CURSOR.

                            Create or replace package types
                            as
                            type ref_cursor is ref cursor;
                            end;

                            Depois crio uma procedure simulando a sua procedure.

                            Create or replace procedure p_busta_depto(p_codigo in number, p_curs in out types.ref_cursor) is
                            begin
                            open p_curs for
                            select * from departamento
                            where codigo = p_codigo;
                            end;

                            Ai sim chamo seu bloco plsql. E ele me traz os resultados.


                            Declare
                            PCURSOR Types.ref_cursor;

                            V_CODIGO DEPARTAMENTO.CODIGO%Type;
                            V_NOME DEPARTAMENTO.NOME%Type;
                            V_COD_REGIAO DEPARTAMENTO.REGIAO%Type;
                            begin
                            P_BUSTA_DEPTO(&codigo, Pcursor);
                            LOOP
                            FETCH Pcursor INTO V_CODIGO, V_NOME, V_COD_REGIAO;
                            EXIT WHEN Pcursor%NOTFOUND;
                            dbms_output.put_line(V_CODIGO || ' , ' || V_NOME || ' , ' || V_COD_REGIAO);
                            END LOOP;
                            CLOSE Pcursor;

                            end;

                            Se não for isso então não consegui ainda entender sua duvida.

                            []’s

                            #78094
                            Anônimo

                              hahahah Exatamente!!!
                              Eu fiz uma adaptação meia boca pra uma que eu tinha aqui e que funcionou!!! considere assim. Acho(tomara.. rs) que agora está certo.

                              declare
                              vCODIGO DEPARTAMENTO.CODIGO%TYPE
                              vNOME DEPARTAMENTO.NOME%TYPE
                              vCOD_REGIAO DEPARTAMENTO.COD_REGIAO%TYPE
                              Pcursor CURSOR;
                              begin
                              P_BUSCA_DEPTO(1, Pcursor); — Quero buscar o registro 1
                              LOOP
                              FETCH Pcursor INTO vCODIGO, vNOME, vCOD_REGIAO;
                              EXIT WHEN Pcursor%NOTFOUND;
                              dbms_output.put_line(CODIGO || ‘ , ‘ || NOME || ‘ , ‘ || COD_REGIAO);
                              END LOOP;
                              CLOSE Pcursor;

                              #78096
                              Fontalva
                              Participante

                                Lininha,

                                pelo que percebi voce não deve estar compilando o codigo para saber se esta ou não funcionando, pois pelo que vi só de olhar seu codigo da pra perceber que não vai funcionar.

                                no seguinte:

                                declare
                                vcodigo ... --> Voce esta declarando como 'v'codigo
                                vnome ... --> Voce esta declarando como 'v'nome
                                vcod_regiao ...--> Voce esta declarando como 'v'cod_regiao

                                dbms_output.put_line(codigo||', '||nome||', '||', '||regiao); --> Aqui voce esqueceu do 'v'

                                #78099
                                Anônimo

                                  Eu acho que vc não entendeu!!!!! Este código que está ai eu realmente não compilei pois foi só pra vc ter uma idéia do que eu estava fazendo! Como eu já disse em algum momento, foi apenas pra adaptação meia boca.
                                  O código que eu fiz funcionou direitinho para outra procedure entendeu?
                                  Mas deixa pra lá…

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