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 RYNNES
      Um parque de diversão está começando a investir em tecnologia e a realizar automatização de alguns brinquedos, por meio do uso de inteligência artificial e tecnologias de escâner, a fim de verificar a altura dos clientes, e definir se eles estão aptos a entrar ou não em um brinquedo, sem precisar utilizar réguas ou medidor físico. Você foi contratado para desenvolver um protótipo de algoritmo para realizar essa verificação.
       
       
       
      Sendo assim, é necessário descrever a importância de fazer uma análise de um problema, aplicando as estruturas de repetição e o conceito na prática para verificar se três pessoas, medindo 1,73, 1,81 e 1,85 m podem entrar em um brinquedo que aceita somente maiores de 1,80 m. O algoritmo deve medir a altura das pessoas e efetuar uma avaliação, constatando se a altura é maior ou igual a 1,80 m, para possam entrar. Se menor do que 1,80 m, o programa apresenta a mensagem “Entrada Não Permitida”.
       
    • By alekoxid
      Olá pessoal, estou fazendo um programa em Python, baseado em outro em C.
       
      Como eu escreveria esse trecho aqui em python?
      Se alguém puder me explicar, eu agradeço
       
      Código:
      #S é definido como 1000000
      #n_pts=20
       
       
      Void numeric(){
            float a, b , c, d;
            float P_[100],Q_[100], T[100];
            float den;
            float dx=L/(n_pts-1);
       
           P_[1]=0;
           Q_[1]=Ta;
           T[1]=Ta;
           T[n_pts]=Tb;
           a=(2*k/dx);
           c=d=k/dx;
           d=S*dx;
           int n;
       
          for ( n=2; n< n_pts; n++){
          den= (a-c*P_[n-1]);
          P_[n]= b/ den;
         Q_[n]= (d+c*Q_[n-1])/den
         }
       
        printf("\n\n Solução : \n")
        print("\n Ponto %2d T=%4.1f C", n_pts, T[n_pts]);
       
      for ( n=n_pts-1; n>1; n--){
          T[n]=Q_[n]+P_[n]*T[n+1];
          printf("\n Ponto %2 T=%4.1f C", n, T[n]);
          }
    • By jeffer261
      Pessoal, boa noite!
       
      Alguem poderia por gentileza modificar o codigo abaixo  em C++ para C?
       
       
      #include <stdio.h>
      #include <stack>
      int main(){
          int n, i, j;
          char linha[2000];
          char entrada[1000], saida[1000];
          std::stack<char> pilha;
          
          while(scanf("%d", &n) && n){
              for (i = 0; i < n; i++) 
                  scanf(" %c", &entrada);
              for (i = 0; i < n; i++) 
                  scanf(" %c", &saida);
              entrada[n] = saida[n] = '\0';
              i = j = 0;
              while(1){
                       if(!pilha.empty() && j < n && pilha.top() == saida[j]){
                             pilha.pop();
                             printf("R");
                             j++;
                       }else if(i < n){
                              pilha.push(entrada);
                              printf("I");
                              i++;
                       }else break;                    
              }
              
              if(pilha.empty()) printf("\n");
              else  printf(" Impossible\n");
              while (!pilha.empty()){
                    pilha.pop();
              }
          }
          return 0;
      }
    • By kateLorrayne
      Oii, Preciso de ajuda em uma atividade que sinceramente não estou sabendo montar, em partes individual eu ate sei, mas unificar é a minha dificuldade, peguei essa resposta da internet, porem não roda, se alguém puder me ajudar, eu agradeço.
       
      *Faça um programa em linguagem de programação C++ para resolver o problema abaixo:
      “Dado um número inteiro positivo N, determinar:
      (a) o total de dígitos pares de N;
      (b) o total de dígitos impares de N;
      (c) a soma dos dígitos de N;
      (d) qual é o maior e qual é o menor digito que ocorre em N.
       
      #include <stdio.h>
      #include <stdlib.h>
      int main()
      {
          int num1[5], par[5],impar[5];
          //Entrada do numero de 4 digitos
          printf("Digite um numero entre 1000-9999:\n");
          scanf("%d", &num1);
          if(num1<1000 || num1>9999)  /*Condição de existência*/
          {
              printf("Numero Invalido");
          }
           return 0;
      }
      #include <stdio.h>
      int ckdig (int n, int* p, int* i)
      {
          int d = 0;
          
          if(n < 0)   n = -n;
          *p = *i = 0;
          
          while(n)
          {
              if((n % 2) == 0)
                  (*p)++;
              else
                  (*i)++;
              n /= 10;
              d++;
          }
          return d;
      }
       
       
    • By victormota1695
      Estou desenvolvendo um programa para trabalho de faculdade onde
      preciso usar estrutura de repetição para perguntar ao usuario um nome/itens armazena-los e quando o usuario nao quiser mais digitar os nomes ao sair do loop mostra todos os nomes que ele digitou.
       
      nao estou conseguindo preciso de ajuda. dese ja agradeço.
       
      meu codigo ate o momento e:
       
      #include <stdio.h>
      #include<stdlib.h>

      int main (){
      char lista,lista2;
      int menu1,menu2;

      printf("***BEM-VINDO AO LISTSUPER***\n\n");
      // ****Aqui o 1º menu de seleção****//
      printf("Escolha uma opção\n");
      printf("1-inserir novos itens\n2-inserir quantidade\n3-calcular valor\n4-mostrar itens\n\n");
      scanf("%i",&menu1);

      // ***Aqui e o loop para digitar os itens desejados****//
      if (menu1==1){
        while(1) {
             printf("insira os itens\n");
             scanf("%s",&lista);
             printf("deseja inserir novos itens? [1-sim/2-nao]\n");
             scanf("%i",&menu2);

       if (menu2==2){ break;}
      }
      }
      // ***Caso ele não selecione a opção para inserir novos itens aparecera esta mensagem***//
      else {
          printf("Não ha itens inseridos\nEscolha a opção ( inserir novos itens )");
      }
      //***Apos acabar de digitar os itens mostrar a lista dos itens digitados***//

      return 0;

      }
       
×

Important Information

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