Jump to content
MarKteus

Como fazer proc Oracle retornar valores para serem usados na aplicação

Recommended Posts

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;

Share this post


Link to post
Share on other sites

O que se quer retornar ? A SP acims só tem 1 parâmetro de entrada não retornando nada.

Share this post


Link to post
Share on other sites

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;

Share this post


Link to post
Share on other sites

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;



Share this post


Link to post
Share on other sites

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;

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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;

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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;​

Share this post


Link to post
Share on other sites

Será que estes erros podem estar sendo causados pelo Oracle Application Express a GUI do Oracle que roda no Browser ?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Darwin Osi
      Estou com o Visual Studio 2013 instalado sob o Windows 10. Quando tento abrir o primeiro projeto do livro supracitado, chamado Music Trivia, o Visual Studio 2013 montra na janela Solution Express a mensagem:
       
      > Solution 'Music Trivia' (0 projects)
          > Music Trivia (Windows 8.1 required)
              > This computer must be upgraded to Windows 8.1 to load this project.
       
      Como resolver isso e carregar esse e os outros projetos do livro? Desde já agradeço qualquer ajuda.
    • By Felipe_N22
      Pessoal, como que eu crio uma rotina no MySQL para efetuar delete de registros inseridos nos últimos 30 dias, e fazer com que esse procedimento rode todos os dias automaticamente em determinado horário?
    • By lsramos
      Tenho um DataGridView que exibe uma tabela do banco de dados. Até aí tudo bem :)
      A questão é que o cabeçalho (primeira linha do DataGrid) traz o nome das colunas da tabela do banco (exemplo: matricula, nome, data_nascimento, etc).
      Eu queria saber se é possível, até para melhor visualização, que eu personalizasse esse cabeçalho sem alterar do banco.
      Algo como inserir no DataGrid o nome das colunas e exportar do banco de dados sem o nome da coluna.
    • By eduarda_dasilveira
      O sistema deverá, utilizando a linguagem C, receber 6 apostas (6 números cada
      aposta no intervalo de 1 a 60) e armazenar estas informações em uma matriz quadrada de
      ordem 6. Um vetor chamado vetGabarito  deve armazenar 6 números, que são os gabaritos
      da aposta.
      Com a matriz de apostas preenchidas, o sistema deverá:
      a. Mostrar a soma da diagonal principal da matriz de apostas.
      b. Transferir todas as apostas para vetores de inteiros de 6 posições.
      c. Indicar quantos números pares e ímpares foram apostados.
      d. Indicar quantos acertos o jogador obteve para cada conjunto de aposta.
       
      Estou com dificuldade de fazer letra d.
      Meu código esta ai mas esta dando erro (mostrando a quantidade errada de acertos) na parte da letra d.
      #include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib.h> int main (void){ int mat [6][6], vetGabarito[6], vet1[6], vet2[6], vet3[6], vet4[6], vet5[6], vet6[6], l, c, soma_diagonal=0, impar=0, par=0; srand (time (NULL)); for (l=0; l<6; l++){ for (c=0; c<6; c++){ printf ("Digite a sua aposta de 1 a 60:"); scanf ("%d", &mat [l][c]); } } for (l=0; l<6; l++){ for (c=0; c<6; c++){ printf (" %d", mat [l][c]); } printf ("\n"); } for (l=0; l<6; l++){ for (c=0; c<6; c++){ if (l==c){ soma_diagonal=soma_diagonal+mat[l][c]; } } } for (c=0; c<6; c++){ vet1[c]= mat [0][c]; vet2[c]= mat [1][c]; vet3[c]= mat [2][c]; vet4[c]= mat [3][c]; vet5[c]= mat [4][c]; vet6[c]= mat [5][c]; printf ("Apostas do jogador na rodada [%d] e %d\n", c, vet1[c]); printf ("Apostas do jogador na rodada [%d] e %d\n", c, vet2[c]); printf ("Apostas do jogador na rodada [%d] e %d\n", c, vet3[c]); printf ("Apostas do jogador na rodada [%d] e %d\n", c, vet4[c]); printf ("Apostas do jogador na rodada [%d] e %d\n", c, vet5[c]); printf ("Aposta do jogador na rodada [%d] e %d\n", c, vet6[c]); } for (l=0; l<6; l++){ for (c=0; c<6; c++){ if ((mat[l][c]%2)==0){ par++; } else { impar++; } } } srand (time (NULL)); for (c=0;c<6;c++){ vetGabarito[c]=rand()%10; } for (c=0; c<6; c++){ printf (" %d", vetGabarito[c]); printf ("\n"); } for (c=0; c<6; c++){ vet1[0]==vetGabarito[c]; vet2[1]==vetGabarito[c]; vet3[2]==vetGabarito[c]; vet4[3]==vetGabarito[c]; vet5[4]==vetGabarito[c]; vet6[5]==vetGabarito[c]; } printf ("A soma da diagonal da matriz e: %d\n", soma_diagonal); printf ("A quantidade de numeros pares foi %d, e de numeros impares foi %d\n", par, impar); printf ("O jogador na primeira rodada teve %d de acertos.\n", vet1[0]); printf ("O jogador na segunda rodada teve %d de acertos.\n", vet2[1]); printf ("O jogador na terceira rodada teve %d de acertos.\n", vet3[2]); printf ("O jogador na quarta rodada teve %d de acertos.\n", vet4[3]); printf ("O jogador na quinta rodada teve %d de acertos.\n", vet5[4]); printf ("O jogador na sexta rodada teve %d de acertos.\n", vet6[5]); return 0; }  
    • By Davi DEVV
      Faça um algoritmo que (utilize funções com ponteiros):
      - Tenha um menu que permita entrar nas funções inserir e buscar, ao selecionar a função inserir, insira somente um funcionário por vez, voltando ao menu principal.
      - Tenha uma estrutura para armazenar, nome, número do cartão e setor de um funcionário.
      - Armazene 10 funcionários.
      - Permita buscar os dados de um funcionário através do número do cartão.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.