- 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.
-
AutorPosts
-
30 de dezembro de 2006 às 6:21 am #78025Anô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;
/2 de janeiro de 2007 às 3:34 pm #78048chduarteParticipanteSe 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;
/[]
2 de janeiro de 2007 às 3:37 pm #78050CJonesParticipanteVoce 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 [].
2 de janeiro de 2007 às 4:26 pm #78052FontalvaParticipanteApenas 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]2 de janeiro de 2007 às 7:24 pm #78064Anônimomouraca, 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?2 de janeiro de 2007 às 7:35 pm #78066Anô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;
/3 de janeiro de 2007 às 2:44 pm #78081FontalvaParticipanteEssa é 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;
3 de janeiro de 2007 às 2:53 pm #78083AnônimoObrigada 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 🙂3 de janeiro de 2007 às 4:06 pm #78085FontalvaParticipanteMe 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.[].
3 de janeiro de 2007 às 5:12 pm #78087AnônimoEsta 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 🙂
3 de janeiro de 2007 às 8:36 pm #78089FontalvaParticipanteEste 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]3 de janeiro de 2007 às 8:43 pm #78092FontalvaParticipanteA 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
3 de janeiro de 2007 às 8:44 pm #78094Anônimohahahah 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;3 de janeiro de 2007 às 9:21 pm #78096FontalvaParticipanteLininha,
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_regiaodbms_output.put_line(codigo||', '||nome||', '||', '||regiao); --> Aqui voce esqueceu do 'v'
3 de janeiro de 2007 às 9:28 pm #78099AnônimoEu 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á… -
AutorPosts
- Você deve fazer login para responder a este tópico.