- Este tópico contém 20 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 3 meses atrás por
Girino.
-
AutorPosts
-
25 de novembro de 2009 às 2:40 pm #91121
Girino
ParticipanteOlá, Bom Dia..!! 8)
A minha dúvida é a seguinte: 🙄
No SQL Server tenho uma procedure que funciona da seguinte maneira:
CREATE PROCEDURE TESTE
@PAR1 VARCHAR(4)
AS
SELECT *FROM TABELA
WHERE CODIGO = @PAR1Quando eu executo esta procedure, ela me retorna todos os campos da minha tabela pelo código informado pelo parâmetro, como se fosse um select.
A chamada da Procedure eu faço assim:
EXEC TESTE (‘0025’)
___________________________________________________________________________________________________________________
Gostaria muito de um exemplo de como fazer a mesma procedure, porém para o Banco de Dados ORACLE.
Já pesquisei em outros Fóruns também e na net, mas não obtive resposta.
Se alguém souber e puder ajudar, agradeço desde já.Preciso da Procedure e do Comando de chamada da mesma. 😉
25 de novembro de 2009 às 3:39 pm #91122MauroLacerda
ParticipanteCREATE OR REPLACE PROCEDURE Teste (p_par IN NUMBER)
IS
CURSOR tabela is select emp_codigo from tabela where emp_codigo=p_par;
v_codigo number(6);
BEGIN
OPEN tabela;
LOOP
FETCH tabela INTO v_codigo;
EXIT WHEN tabela%NOTFOUND;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_codigo);END; END LOOP;END;
exec teste(x);
25 de novembro de 2009 às 3:39 pm #91123MauroLacerda
ParticipanteCREATE OR REPLACE PROCEDURE Teste (p_par IN NUMBER)
IS
CURSOR tabela is select emp_codigo from tabela where emp_codigo=p_par;
v_codigo number(6);
BEGIN
OPEN tabela;
LOOP
FETCH tabela INTO v_codigo;
EXIT WHEN tabela%NOTFOUND;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_codigo);END; END LOOP;END;
exec teste(x);
25 de novembro de 2009 às 4:12 pm #91125Girino
ParticipanteOlá..!! 8)
Fiz conforme você me passou. Consegui compilar a procedure, porém da erro qdo eu vou executá-la.
CREATE OR REPLACE PROCEDURE teste3 (p_par IN VARCHAR2)
IS
CURSOR APONTAMENTO is select CODCC_R from APONTAMENTO where CODCC_R = p_par;
v_codigo VARCHAR2( 8 );
BEGIN
OPEN APONTAMENTO;
LOOP
FETCH APONTAMENTO INTO v_codigo;
EXIT WHEN APONTAMENTO%NOTFOUND;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_codigo);
END;
END LOOP;
END;exec teste3(‘02210002’);
ORA-00900: instrução SQL inválida
Onde estou errando..??? 🙄
Muito Obrigado pela atenção..!!
25 de novembro de 2009 às 4:22 pm #91126MauroLacerda
ParticipanteFaz assim:
Show error
E veja os privilegios do usuario tambem.
25 de novembro de 2009 às 4:27 pm #91127MauroLacerda
ParticipanteConfigure os privilegios do usuario para “CREATE PROCEDURE”
25 de novembro de 2009 às 4:29 pm #91128Girino
ParticipanteOLÁ..!!
Se eu executar este comando show erro da o mesmo erro:
ORA-00900: instrução SQL inválida
Estou tentando rodar no editor de comandos SQL do ORACLE XE.
Será que é por isso?Mas fiz o teste com 2 funções que tenho aqui e rodou normal..!!
25 de novembro de 2009 às 4:34 pm #91129fsitja
ParticipanteNo Oracle você precisaria declarar um parâmetro de saída na procedure
ou usar uma function. Há pelo menos duas alternativas:1 – Usar um ref cursor para retornar um resultset para o client, ou aplicação
que chamou a procedure. O chamador vai fazer o “fetch” dos dados e
usá-los como precisar. É retornada apenas uma referência (“ponteiro”),
mais flexível e consome menos recursos do que a alternativa 2.2 – Retornar uma nested table / varray / associative array (index-by
table). Nesse caso você precisa criar um type do tipo necessário, dar o
fetch na table e retornar a estrutura em memória, pronta para ser usada.
Vai, por consequência, utilizar mais memória e não é recomendado se o
seu retorno tiver muitas milhares de linhas.Pode-se usar uma function no lugar da procedure também, pois ela
retorna dados sem precisar de parâmetro OUT. Peguei um exemplo que
eu tinha feito outro dia para pipelined table function, um pouco mais
complexo, mas que conceitualmente serve para a mesma coisa. Testei
usando a view v$version, substitua pela sua tabela.Abraços,
Francisco.25 de novembro de 2009 às 4:37 pm #91130Girino
ParticipanteVejam:
[url=http://img230.imageshack.us/i/erroya.jpg/:3ibsgvl0]
abraços..!! 😀
Renato 😥
25 de novembro de 2009 às 4:39 pm #91131fsitja
ParticipanteEdit: continuando mensagem acima
1
CREATE OR REPLACE PROCEDURE
test_ref(cur_output OUT sys_refcursor) IS
BEGIN
OPEN cur_output FOR
WITH teste AS
(SELECT 1 num FROM dual)
SELECT num
FROM teste;
END;2
CREATE OR REPLACE PACKAGE pk_type AS
TYPE t_tab IS TABLE OF v$version%rowtype;
END pk_type;CREATE OR REPLACE FUNCTION sp_test return pk_type.t_tab
PIPELINED IS
v_saida pk_type.t_tab;
v_refcur SYS_REFCURSOR;
BEGIN
OPEN v_refcur FOR
SELECT * from v$version;
FETCH v_refcur BULK COLLECT
INTO v_saida;
close v_refcur;
for i in 1 .. v_saida.count
loop
PIPE ROW(v_saida(i));
end loop;
END sp_test;select * from table(sp_test)
25 de novembro de 2009 às 4:52 pm #91134MauroLacerda
ParticipantevEJA O PRIVILEGIO.
Configure os privilegios do usuario para “CREATE PROCEDURE”
25 de novembro de 2009 às 5:02 pm #91135Girino
ParticipanteOlá..!! 8)
Este usuário já está com privilégios de “DBA” 😉
25 de novembro de 2009 às 6:59 pm #91136fsitja
Participante[quote=”Girino”:28r9z3on]Olá..!! 8)
Este usuário já está com privilégios de “DBA” 😉 [/quote]
Você não está no console, então tenta o seguinte…
BEGIN
teste3('02210002');
END;
25 de novembro de 2009 às 8:02 pm #91139burga
Participante[quote=”Girino”:3vfg6x9j]Olá..!! 8)
Fiz conforme você me passou. Consegui compilar a procedure, porém da erro qdo eu vou executá-la.
CREATE OR REPLACE PROCEDURE teste3 (p_par IN VARCHAR2)
IS
CURSOR APONTAMENTO is select CODCC_R from APONTAMENTO where CODCC_R = p_par;
v_codigo VARCHAR2( 8 );
BEGIN
OPEN APONTAMENTO;
LOOP
FETCH APONTAMENTO INTO v_codigo;
EXIT WHEN APONTAMENTO%NOTFOUND;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_codigo);
END;
END LOOP;
END;exec teste3(‘02210002’);
ORA-00900: instrução SQL inválida
Onde estou errando..??? 🙄
Muito Obrigado pela atenção..!![/quote]
Você precisa passar o p_par como parâmetro pro cursor.
Não pode passar direto…O cursor ficaria assim:
CURSOR APONTAMENTO (p_parametro IN VARCHAR2) is select CODCC_R from APONTAMENTO where CODCC_R = p_parametro;
e pra abrir o cursor:
OPEN APONTAMENTO(p_par);
25 de novembro de 2009 às 8:24 pm #91141Girino
ParticipanteOlá.. 8)
Dessa maneira executou..!! 😀
Como transformar o meu primeiro exemplo agora..
Tentei conforme foi passado mas não consegui..!! 🙄 🙄
Será possível??? 🙄 🙄
Muuito Obrigado..!!
-
AutorPosts
- Você deve fazer login para responder a este tópico.
