Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DaniloTec

Executar Procedure

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

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

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
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

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

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, o DaniloTec queria retiornando um Cursor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.