Ir para conteúdo

POWERED BY:

Arquivado

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

NaPraia

Procedure simples

Recommended Posts

Oi pessoal, tem algumas coisas que eu acho estranhas no oracle, pois durante muito tempo usei o SQL Server e algumas coisas são um pouco diferentes. Estou tentando criar uma procedure para realizar uma consulta, para ficar mais simples do usuário utilizá-la. Transferindo o código do SQL Server para o ORACLE ficaria assim:

 

create or replace procedure P_EXTRATO_IR(P_ANO DATE, P_MATRICULA NUMBER) is  BEGINSELECT DISTINCT E.CD_FUNCIONARIO MATRICULA, E.NM_TITULAR TITULAR, E.CD_ALTERNATIVO BENEFICIARIO, E.NM_BENEFICIARIO NOME, 	  TO_CHAR(A.DT_ANO_MES_REF,'MM') MES, C.CD_GRUPO_LANCTO, (NVL(B.VL_BENEFICIARIO,0)) VL_MENSALIDADE 	  FROM HC_DEBITO_BENEFICIARIO A, HC_TOTAL_LANCTO_BENEF B, HC_GRUPO_LANCTO_CONFIG_IR C, HC_PARCELA_DEBITO_BENEF D,	  HC_V_BENEFICIARIO E	  WHERE to_char(A.DT_ANO_MES_REF, 'yyyy') = P_ANO	  AND CD_ALTERNATIVO = P_MATRICULA	  AND A.CD_BENEFICIARIO = B.CD_BENEF_TITULAR	  AND A.DT_ANO_MES_REF = B.DT_ANO_MES_REF	  and (a.st_debito_beneficiario = 'Q' or a.st_debito_beneficiario = 'R')	  AND A.CD_GRUPO_LANCTO = C.CD_GRUPO_LANCTO	  AND to_char(A.DT_ANO_MES_REF, 'yyyy') = C.CD_EXERCICIO	  AND A.CD_BENEFICIARIO = D.CD_BENEFICIARIO	  AND A.CD_GRUPO_LANCTO = D.CD_GRUPO_LANCTO											   	  AND A.DT_ANO_MES_REF = D.DT_ANO_MES_REF_COB	  AND D.ST_COBRANCA = 'R'	  AND A.CD_GRUPO_LANCTO = B.CD_GRUPO_LANCTO	  AND B.CD_BENEFICIARIO = E.CD_BENEFICIARIO	  ORDER BY NM_BENEFICIARIO, CD_GRUPO_LANCTO , TO_CHAR(A.DT_ANO_MES_REF,'MM');  end P_EXTRATO_IR;
e eu passaria para o usuário o seguinte:

P_EXTRATO_IR('2006', '1234')

Só que no ORACLE, tá dando o erro 'pls-00428' - é esperada uma cláusula INTO na instrução do SELECT

eu não tenho necessidade ao meu ver de ter o INTO, mas se o ORACLE quer, fazer o quê.

Alguém para ajudar??

Como é que eu posso fazer essa procedure funcionar e listar os dados??

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

alterei a minha consulta, coloquei com tal do INTO, mas só que está dando um outro problema.

 

create or replace procedure P_EXTRATO_IR(P_ANO	   VARCHAR2,										 P_MATRICULA VARCHAR2) is  V_MATRICULA	NUMBER(10);  V_TITULAR	  VARCHAR2(80);  V_BENEFICIARIO VARCHAR2(20);  V_NOME		 VARCHAR2(80);  V_MES		  VARCHAR2(10);  V_GRUPO		VARCHAR2(50);  V_VALOR		FLOAT;BEGIN  SELECT DISTINCT E.CD_FUNCIONARIO MATRICULA,				  E.NM_TITULAR TITULAR,				  E.CD_ALTERNATIVO BENEFICIARIO,				  E.NM_BENEFICIARIO NOME,				  TO_CHAR(A.DT_ANO_MES_REF, 'MM') MES,				  C.CD_GRUPO_LANCTO,				  (NVL(B.VL_BENEFICIARIO, 0)) VL_MENSALIDADE	INTO V_MATRICULA,		 V_TITULAR,		 V_BENEFICIARIO,		 V_NOME,		 V_MES,		 V_GRUPO,		 V_VALOR	FROM HC_DEBITO_BENEFICIARIO	A,		 HC_TOTAL_LANCTO_BENEF	 B,		 HC_GRUPO_LANCTO_CONFIG_IR C,		 HC_PARCELA_DEBITO_BENEF   D,		 HC_V_BENEFICIARIO		 E   WHERE to_char(A.DT_ANO_MES_REF, 'yyyy') = P_ANO	 AND CD_ALTERNATIVO = P_MATRICULA	 AND A.CD_BENEFICIARIO = B.CD_BENEF_TITULAR	 AND A.DT_ANO_MES_REF = B.DT_ANO_MES_REF	 and (a.st_debito_beneficiario = 'Q' or a.st_debito_beneficiario = 'R')	 AND A.CD_GRUPO_LANCTO = C.CD_GRUPO_LANCTO	 AND to_char(A.DT_ANO_MES_REF, 'yyyy') = C.CD_EXERCICIO	 AND A.CD_BENEFICIARIO = D.CD_BENEFICIARIO	 AND A.CD_GRUPO_LANCTO = D.CD_GRUPO_LANCTO	 AND A.DT_ANO_MES_REF = D.DT_ANO_MES_REF_COB	 AND D.ST_COBRANCA = 'R'	 AND A.CD_GRUPO_LANCTO = B.CD_GRUPO_LANCTO	 AND B.CD_BENEFICIARIO = E.CD_BENEFICIARIO   ORDER BY NM_BENEFICIARIO,			CD_GRUPO_LANCTO,			TO_CHAR(A.DT_ANO_MES_REF, 'MM');  Dbms_Output.put_line(V_MATRICULA);  Dbms_Output.put_line(V_TITULAR);  Dbms_Output.put_line(V_BENEFICIARIO);  Dbms_Output.put_line(V_NOME);  Dbms_Output.put_line(V_MES);  Dbms_Output.put_line(V_GRUPO);  Dbms_Output.put_line(V_VALOR);end P_EXTRATO_IR;
compila sem erros

só que quando tento chamar

begin  -- Call the procedure  p_extrato_ir(p_ano = '2006',			   p_matricula = '1515157');end;
dá o erro ORA-01036: illegal variable name/number

eu sei que esse usuário que eu estou usando tem poucos privilégios.

Como o outro dia eu queria usar o UTL_FILE, não deu pq eu não tinha privilégios, aí tive que usar o text_io

será que pode ser isso em função do Dbms_Output.put_line????

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

arrumei a chamada da procedure para:

begin  -- Call the procedure  :p_ano := '2006';  :p_matricula := '1515157';  p_extrato_ir(p_ano => :p_ano,			   p_matricula => :p_matricula);end;
só que agora está dando outro erro (ora-01422 - retorna mais dados do que o esperado)

Só que eu quero trazer várias linhas mesmo.

Alguma sugestão??

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eheheheheheh Eduardo,

 

Cara, é um pouco diferente do SQL Server (CONCORDO CONTIGO, O SQL SERVER PARA SP é mais fácil.), porém, sabe um modo que poderá FACILITAR sua vida totalmente, é criar um CURSOR, Aí terá várias maneiras de exibir os dados.

 

Abaixo, fiz um exemplo básico utilizando o DBMS_OUTPUT, mas poderá utilizar UTL_FILE, SMTP, REFCURSOR e etc...

 

Exemplo:

 

SQL*Plus: Release 10.2.0.1.0 - Production on Qua Jan 3 10:16:41 2007Copyright (c) 1982, 2005, Oracle.  All rights reserved.SQL> conn rodrigoalmeidaInforme a senha:Conectado.SQL> create table X (a number(5), b varchar2(10));Tabela criada.SQL> declare  2	 contador integer;  3  begin  4	 contador := 1;  5	 while contador <= 1000 loop  6			 insert into X values (contador,'TESTE');  7			 contador := contador + 1;  8	 end loop;  9  commit; 10  end; 11  /Procedimento PL/SQL concluÝdo com sucesso.SQL> select * from X where rownum < 11;		 A B---------- ----------	   976 TESTE	   977 TESTE	   978 TESTE	   979 TESTE	   980 TESTE	   981 TESTE	   982 TESTE	   983 TESTE	   984 TESTE	   985 TESTE10 linhas selecionadas.SQL> set serveroutput on size 10000SQL> @tmpProcedimento criado.SQL> l  1  create or replace procedure RA_TESTE (numero number) is  2  cursor curTESTE is (select * from X where a = numero);  3  recTESTE curTESTE%rowtype;  4  begin  5	 open curTESTE;  6	 loop  7			 fetch curTESTE into recTESTE;  8			 exit when curTESTE%notfound;  9					 dbms_output.put_line ('VALOR DE A: ' || recTESTE.A || ' E VALOR DE B : ' || recTESTE.B); 10	 end loop; 11* end;SQL> exec RA_TESTE (33);VALOR DE A: 33 E VALOR DE B : TESTEProcedimento PL/SQL concluÝdo com sucesso.SQL>

Lógico que deverá sofrer várias alterações para sua utilização, porém, esse é o caminho das pedras!

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/natal_w00t.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu rodrigo, mas a cliente pediu outras alterações e fui fazer um relatório mesmo.Nada que o bom e velho reports não faça.Mas vou dar uma boa analisada nesse teu código, pois cedo ou tarde vou precisar usar isso.Falou e obrigado

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.