DaniloTec 0 Denunciar post Postado Janeiro 31, 2012 Bom dia. Peguei um projeto aqui em Oracle e estou apanhando muito, hehe... Eu criei um Procedure e gostaria de saber como eu faço pra executar? Segue a Procedure: create or replace PROCEDURE PRC_BUSCA_PERFIL ( pID_TRANSPORTADORA perfil.id_transportadora%TYPE ,pPERFIL perfil.nome%TYPE default null ,RETORNO OUT SYS_REFCURSOR ) AS BEGIN OPEN RETORNO FOR SELECT ID, NOME, DESCRICAO, ID_TRANSPORTADORA FROM PERFIL WHERE ((ID_TRANSPORTADORA = pID_TRANSPORTADORA) OR (ID_TRANSPORTADORA IS NULL)) and ((pPERFIL is null) or (nome like '%' + pPERFIL + '%')) ORDER BY NOME; END PRC_BUSCA_PERFIL; Eu também achei muito estranho esse RETORNO OUT SYS_REFCURSOR. Se eu coloco um simples SELECT ele não aceita. Diz que está faltando um INTO na instrução. De qualquer forma, é uma procedure simples. Como faço pra executar testando os parâmetros? Vlw! Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Janeiro 31, 2012 Exemplo num bloco anônimo. DECLARE VID PERFIL.ID%TYPE; VNOME PERFIL.NOME%TYPE; VDESCRICAO PERFIL.DESCRICAO%TYPE; VID_TRANSPORTADORA PERFIL.ID_TRANSPORTADORA%TYPE; -- pcr SYS_REFCURSOR; begin ... PRC_BUSCA_PERFIL(1,'',pcr); loop fetch pcr into VID,VNOME,VDESCRICAO,VID_TRANSPORTADORA ;--campos d exit when q%notfound; dbms_output.put_line(VID); dbms_output.put_line(VNOME); dbms_output.put_line(VDESCRICAO); dbms_output.put_line(VID_TRANSPORTADORA ); end loop; end; Ajudou ? Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Janeiro 31, 2012 Bom dia, Motta. Desculpe, mas não ajudou muito não. Eu não consigo entender porque no Oracle as coisas são tão complicadas. Ou sou eu que não estou acostumado. Não existe uma forma mais simples, tipo: execute PRC_BUSCA_PERFIL(valor,valor,valor); ? Não consigo entender porque coisas simples no SQL Server são tão complicadas no Oracle. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Janeiro 31, 2012 Qual o problema original ? O Cursor como parâmetro se usa para chamar um select de outra procedure. Isto é preciso ? Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Janeiro 31, 2012 Não. O select que eu preciso é da própria Procedure. O que eu quero é executar exatamente isso: SELECT ID, NOME, DESCRICAO, ID_TRANSPORTADORA FROM PERFIL WHERE ((ID_TRANSPORTADORA = pID_TRANSPORTADORA) OR (ID_TRANSPORTADORA IS NULL)) and ((pPERFIL is null) or (nome like '%' + pPERFIL + '%')) ORDER BY NOME; Passando alguns parâmetros para a consulta. Mas dentro de uma Procedure ele me pede uma clausula INTO que desconheço. Depois de pesquisar em encontrei esse cursor que "resolveu" meu problema. E depois disso saber como executo uma Procedure passando os valores pra fazer testes. Vlw! Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Janeiro 31, 2012 Em PLSQL um select tem de retornar uma e apenas uma linha (ZERO , DUAS OU MAIS DÁ ERRO), os valores devem ser "jogados" numa variável. SELECT NOME INTO VNOME FROM CLIENTE WHERE COD = '12345'; Caso seja preciso ler mais de um registro, deve-se fazer um cursor, uma forma simples. FOR R IN (SELECT COD, MENSALIDADE FROM CLIENTE WHERE STATUS = 'ATIVO') LOOP INSERT INTO FATURA (CODCLIENTE,DATA,VALOR) AVLUES (R.COD,SYSDATE,R.VALOR); END LOOP; Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Janeiro 31, 2012 E seu eu precisar retornar os valores do SELECT em forma de tabela? Exemplo: FOR R IN (SELECT COD, MENSALIDADE FROM CLIENTE WHERE STATUS = 'ATIVO') LOOP SELECT * FROM R; END LOOP; Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Janeiro 31, 2012 Aí sim pode retornar um cursor, mas que tipo de aplicação vai receber o resultado ? Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Janeiro 31, 2012 Motta, o que eu quero é muito simples. Quer uma Procedure para retornar uma lista de resultados e popular um DataReader com ele. Na verdade, a questão do post nem foi exatamente essa. Eu já tenho essa procedure e gostaria de saber como executo a Procedure no Oracle SQL Development para saber se ela está correta. Só isso. :-) Vlw! Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Janeiro 31, 2012 Não vejo a necessidade de SP para isto, uma query ou view bastariam , não ? SP em PLSQL fica melhor para atualizar dados, gerar arquivos etc. Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Janeiro 31, 2012 Sim. Mas é procedimento da empresa. Tudo deve ser feito em SP. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Janeiro 31, 2012 Ok Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Fevereiro 1, 2012 Bom dia, Motta. Então, eu coloquei este código porque ele não funciona. FOR R IN (SELECT COD, MENSALIDADE FROM CLIENTE WHERE STATUS = 'ATIVO') LOOP SELECT * FROM R; END LOOP; No exemplo que você colocou você fez um INSERT. Eu achei que seria o mesmo com SELECT, mas não é. Também faltou a aparte da chamada da Procedure. Vlw! Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Fevereiro 1, 2012 Não, não funciona assim. Aqui usamos relatório em Crystal Report, fazemos o seguinte esquema : defino uma package CREATE OR REPLACE PACKAGE crystal IS -- -- Definição do cursor para Crystal Reports -- TYPE CrystalCursor IS REF CURSOR; END; / com esta packge definida uma sp que retorne um cursor tem a seguinte estrutura CREATE OR REPLACE PROCEDURE cr_xxx (pCursor IN OUT Crystal.CrystalCursor, pparam IN DATE ) IS BEGIN if pCursor %isopen then Close pCursor; end if; OPEN pcursor FOR SELECT * from tabela where coluna = pparam; END; / O Crystal reconhece esta SP como uma fonte de dados, talvez algo assim funcione aí. Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Fevereiro 2, 2012 Acabei resolvendo o problema de outra forma. Na verdade fiz outra coisa totalmente diferente, a dúvida ainda continua. Continuo sem saber como executo uma procedure no oracle. O oracle consegue complicar tudo aquilo que é simples, impressionante. Não vejo a hora deste projeto acabar e voltar pros bons e velhos SQL Server e MySQL. Vlw mesmo assim. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Fevereiro 2, 2012 Continuo sem saber como executo uma procedure no oracle. Cria-se uma procedure CREATE OR REPLACE PROCEDURE MY_PROC_01(PUF IN CHAR IS BEGIN FOR R IN (SELECT COD, MENSALIDADE FROM CLIENTE WHERE STATUS = 'ATIVO' AND UF = PUF) LOOP INSERT INTO FATURA (CODCLIENTE,DATA,VALOR) AVLUES (R.COD,SYSDATE,R.VALOR); END LOOP; END; Uma 2ª SP a vai chamar CREATE OR REPLACE PROCEDURE MY_PROC_02 IS BEGIN MY_PROC_01('RJ'); MY_PROC_01('SP'); END; Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Fevereiro 2, 2012 Eu acho que eu não estou sendo claro, Motta. O exemplo que você colocou é com INSERT e eu preciso de um exemplo que me retorne um SELECT (conjunto de dados também conhecido como tabela). É difícil de acredita que preciso criar uma procedura pra simplesmente chamar outra. Não existe um execute NOME_DA_PROCEDURE(PARAMETRO_1, PARAMETRO_2, PARAMETRO_3, ...); ? É isso que preciso. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Fevereiro 2, 2012 basta a chamada (sem execute) NOME_DA_PROCEDURE(PARAMETRO_1, PARAMETRO_2, PARAMETRO_3, ...); Quanto a uma Procedure retornar um Cursor (tabela) deu um exemplo no post #14, mas realmente não trabalho assim e se tiver uma maneira menor confesso que não conheço. Compartilhar este post Link para o post Compartilhar em outros sites
Eduardo Corsaletti 0 Denunciar post Postado Maio 29, 2013 Executando direto no banco via sqldeveloper BEGIN NOME_DA_PROCEDURE(PARAMETRO_1, PARAMETRO_2, PARAMETRO_3); END; Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 29, 2013 Eduardo Corsaletti, o DaniloTec queria retiornando um Cursor. Compartilhar este post Link para o post Compartilhar em outros sites