NaPraia 12 Denunciar post Postado Janeiro 2, 2007 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
NaPraia 12 Denunciar post Postado Janeiro 2, 2007 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
NaPraia 12 Denunciar post Postado Janeiro 2, 2007 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
alphamek 2 Denunciar post Postado Janeiro 3, 2007 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
NaPraia 12 Denunciar post Postado Janeiro 3, 2007 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