Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá
Alguém sabe como posso fazer a procedure Oracle retornar para serem valores usados na aplicação assim como já acontece no SQL ?
Estou tentando conforme abaixo, não há erros na proc, mas não consigo obter os valores dos campos.
O que há de errado ?
create or replace PROCEDURE SP_SELECIONA_CLIENTE
(
-- Parametros de entrada
P_ID IN CLIENTE.IDCLIENTE%TYPE
) AS
-- Parametros de saida
VIDCLIENTE CLIENTE.IDCLIENTE%TYPE;
VNOMECLIENTE CLIENTE.NOMECLIENTE%TYPE;
VDATACADASTRO CLIENTE.DATACADASTRO%TYPE;
CURSOR regCliente(P_ID IN CLIENTE.IDCLIENTE%TYPE) IS
SELECT "IDCLIENTE", "NOMECLIENTE", "DATACADASTRO"
FROM CLIENTE C WHERE C.IDCLIENTE = P_ID;
regs regCliente%ROWTYPE;
CURSOR regClientes IS
SELECT "IDCLIENTE", "NOMECLIENTE", "DATACADASTRO"
FROM CLIENTE C;
regs regClientes%ROWTYPE;
BEGIN
IF P_ID IS NOT NULL THEN
IF regCliente%ISOPEN THEN
CLOSE regCliente;
END IF;
OPEN regCliente(P_ID);
FETCH regCliente into
VIDCLIENTE, VNOMECLIENTE, VDATACADASTRO;
ELSE
IF regClientes%ISOPEN THEN
CLOSE regClientes;
END IF;
OPEN regClientes;
FETCH regClientes into
VIDCLIENTE, VNOMECLIENTE, VDATACADASTRO;
END IF;
END;VIDCLIENTE CLIENTE.IDCLIENTE%TYPE;
VNOMECLIENTE CLIENTE.NOMECLIENTE%TYPE;
VDATACADASTRO CLIENTE.DATACADASTRO%TYPE;
Quero retornar as variaveis acima, mas esse foi só um dos testes que estou realizando vejo outro:
create or replace PROCEDURE SP_SELECIONA_CLIENTEE
(
-- Parametros de entrada
P_ID IN CLIENTE.IDCLIENTE%TYPE
) AS
--DECLARE
-- Parametros de saida
VIDCLIENTE CLIENTE.IDCLIENTE%TYPE;
VNOMECLIENTE CLIENTE.NOMECLIENTE%TYPE;
VDATACADASTRO CLIENTE.DATACADASTRO%TYPE;
CURSOR regClientes IS
SELECT "IDCLIENTE", "NOMECLIENTE", "DATACADASTRO"
into VIDCLIENTE, VNOMECLIENTE, VDATACADASTRO
FROM CLIENTE C;
BEGIN
OPEN regClientes;
loop
fetch regClientes into vidcliente, vnomecliente, vdatacadastro;
exit when regClientes%notfound;
end loop;
close regClientes;
END;Veja um exemplo de SP com parâmetro de saída.
Motta, obrigado
Estou vendo esses exemplos desde ontem a noite, ta osso,
vc tem como me dizer se a minha PROC está correta pq percebi que cada exemplo constrói um cursor diferente
Essa minha última não está com erro de compilation e eu já testei e vi que tem dados a serem retornados contudo não consigo capturar esses dados na minha aplicação C#.
Fiz de uma outra maneira e também está correto veja abaixo, porém não consigo resgatar a informação na aplicação.
create or replace PROCEDURE SP_SELECIONA_CLIENTEE
(
-- Parametros de entrada
P_ID IN CLIENTE.IDCLIENTE%TYPE,
VIDCLIENTE out CLIENTE.IDCLIENTE%TYPE,
VNOMECLIENTE out CLIENTE.NOMECLIENTE%TYPE,
VDATACADASTRO out CLIENTE.DATACADASTRO%TYPE
) AS
--DECLARE
-- Parametros de saida
CURSOR regClientes IS
SELECT "IDCLIENTE", "NOMECLIENTE", "DATACADASTRO"
into VIDCLIENTE, VNOMECLIENTE, VDATACADASTRO
FROM CLIENTE C;
BEGIN
OPEN regClientes;
loop
fetch regClientes into vidcliente, vnomecliente, vdatacadastro;
exit when regClientes%notfound;
end loop;
close regClientes;
END;
>
VIDCLIENTE CLIENTE.IDCLIENTE%TYPE;
VNOMECLIENTE CLIENTE.NOMECLIENTE%TYPE;
VDATACADASTRO CLIENTE.DATACADASTRO%TYPE;
Quero retornar as variaveis acima, mas esse foi só um dos testes que estou realizando vejo outro:
create or replace PROCEDURE SP_SELECIONA_CLIENTEE
(
-- Parametros de entrada
P_ID IN CLIENTE.IDCLIENTE%TYPE
) AS
--DECLARE
-- Parametros de saida
VIDCLIENTE CLIENTE.IDCLIENTE%TYPE;
VNOMECLIENTE CLIENTE.NOMECLIENTE%TYPE;
VDATACADASTRO CLIENTE.DATACADASTRO%TYPE;
CURSOR regClientes IS
SELECT "IDCLIENTE", "NOMECLIENTE", "DATACADASTRO"
into VIDCLIENTE, VNOMECLIENTE, VDATACADASTRO
FROM CLIENTE C;
BEGIN
OPEN regClientes;
loop
fetch regClientes into vidcliente, vnomecliente, vdatacadastro;
exit when regClientes%notfound;
end loop;
close regClientes;
END;
1º - Não põe o into no cursor
2º - você não esta filtrando a tabela cliente
3º - Como está passando o id, não precisa de um loop, já que o objetivo, suponho, seja de trazer informações de um registro.
reate or replace PROCEDURE SP_SELECIONA_CLIENTEE
(
-- Parametros de entrada
P_ID IN CLIENTE.IDCLIENTE%TYPE,
-- Parametros de saida
VIDCLIENTE out CLIENTE.IDCLIENTE%TYPE,
VNOMECLIENTE out CLIENTE.NOMECLIENTE%TYPE,
VDATACADASTRO out CLIENTE.DATACADASTRO%TYPE
) AS
CURSOR regClientes IS
SELECT "IDCLIENTE", "NOMECLIENTE", "DATACADASTRO"
FROM CLIENTE C
WHERE ID = P_ID;
begin
open regClientes;
fetch regClientes into VIDCLIENTE, VNOMECLIENTE, VDATACADASTRO;
close regCliente;
end;Essa é apenas uma das querys, tbm terei sitiuações de retornos com mais de uma linha
Testei a proc que vc enviou Sergio ele não deu erro mas não retorna nada na aplicação
HasRow = false
rode isto pra checar se está vindo retorno
caso tenha retorno o problema esta na chamada do c#
declare
v_P_ID cd_firmas.firma%TYPE;
v_VIDCLIENTE cd_firmas.firma%TYPE;
v_VNOMECLIENTE cd_firmas.nome%TYPE;
v_VDATACADASTRO date;
begin
v_p_id := informe um id aqui pra checagem
SP_SELECIONA_CLIENTEE( v_P_ID ,
v_VIDCLIENTE ,
v_VNOMECLIENTE ,
v_VDATACADASTRO );
dbms_output.put_line('p_id:' || v_p_id);
dbms_output.put_line('VIDCLIENTE:' || v_VIDCLIENTE);
dbms_output.put_line('VNOMECLIENTE:' || v_VNOMECLIENTE);
dbms_output.put_line('VDATACADASTRO:' || v_VDATACADASTRO);
END;qdo for mais de uma linha o retorno terá que ser um tipo table e nao um rowtype da tabela
o rowtype seria pra retorna um registro da tabela
você terá que criar um um tipo table
Type cliente_tab Is Table Of cliente%Rowtype Index By Binary_Integer;
create or replace PROCEDURE SP_LISTA_CLIENTE
( TAB_CLIENTE OUT CLIENTE_TAB
) AS
CURSOR regClientes IS
SELECT *
FROM CLIENTE C
;
v_i number(9);
begin
v_i := 1;
for reg in regClientes loop
v_i := v_i + 1;
tab_cliente(v_i).IDCLIENTE := reg.idcliente;
tab_cliente(v_i).NOMECLIENTE := reg.nomecliente;
tab_cliente(v_i).DATACADASTRO := reg.datacadastro;
end loop;
end;
se for muita informação, pode ser melhorado com bulk collection
Create Type cliente_tab Is Table Of cliente%Rowtype Index By Binary_Integer;
a linha acima está retornando o erro a seguir:
Error at line 0: PL/SQL: Compilation unit analysis terminated
Tentando conforme abaixo o erro muda para:
Error at line 21: PLS-00103: Encountered the symbol "" 1. create or replace PROCEDURE SP_SELECIONA_CLIENTES2. ( 3. P_TB_CLIENTE OUT CONTAINER_CLIENTE4. )
create or replace type "CONTAINER_CLIENTE" as table of CLIENTE%RowType
create or replace PROCEDURE SP_SELECIONA_CLIENTES
(
P_TB_CLIENTE OUT CONTAINER_CLIENTE
)
AS
CURSOR regClientes IS
SELECT IDCLIENTE, NOMECLIENTE, DATACADASTRO FROM CLIENTE C;
v_i number(9);
BEGIN
v_i := 1;
FOR reg IN regClientes LOOP
v_i := v_i + 1;
P_TB_CLIENTE (v_i).IDCLIENTE := reg.idcliente;
P_TB_CLIENTE (v_i).NOMECLIENTE := reg.nomecliente;
P_TB_CLIENTE (v_i).DATACADASTRO := reg.datacadastro;
END LOOP;
END;
Será que estes erros podem estar sendo causados pelo Oracle Application Express a GUI do Oracle que roda no Browser ?
O que se quer retornar ? A SP acims só tem 1 parâmetro de entrada não retornando nada.