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 andreia_sp
      Ola pessoal,
       
      nao sei se o correto seria nessa area, na duvida coloquei em C# porque minha aplicação está em C#.
      O problema é o seguinte: tenho um sistema desenvolvido que roda apenas localmente (intranet). Configurei o firewall pra liberar a porta e as outras maquinas acessam normalmente. A questao é que o IP da maquina onde foi hospedado é dinamico. Ou seja, diariamente as outras maquinas "perdem" o acesso.
      Tem como configurar de alguma forma que, independente do IP, todas as maquinas consigam acessar?
       
       
      Obrigada
    • By mamotinho
      Boa noite! estou com dúvidas em relação a array, eu tenho uma procedure no SQL Server e essa procedure exibe uma lista de resultados, eu gostaria de pega o valor desses resultados e lista em um array para eu comparar com outro valor que vai ser selecionado em um select , tipo abaixo:
       
      $arraySelect = $db->prepare(exec WebSite.dbo.server_value_product 2);
      $arraySelect->execute();
      $arrayExemple = $arraySelect->fetchAll();

      procedure_list = array($arrayExemple);
       
      !in_array($valorSelect, $procedure_list){
         echo 'O Valor selecionado não existe nos resultados da procedure';
      }
       
       
      alguem sabe como posso listar o resultado da procedure em array. e sabe se o valor que procuro está entre os resultados da array.
    • By fernandoxwiggy
      Bom dia,
      Alguém já teve que desenvolver o CIOT da empresa E-frete em C#?
       
      Estou buscando exemplos de como fazer usando o web service deles (http://dev.efrete.com.br/Services/LogonService.asmx).
      Eu acredito que preciso chamar o "login" (depois o logout) dentro desse web service, mas ele é uma interface e não estou achando um exemplo de chamar um procedimento em um web service que seja um interface.
       
      Agradeço desde já se alguém puder ajudar.
    • By AndersonVSilva
      Bom dia Pessoal,
       
      Efetuei uma busca no forum e não encontrei alguma solução para meu problema.
       
      Tenho este form via HTML:
       
      <td><form id="form1" action="CallProc02.php" method="post"><input type="hidden" name="id" value="1" /></form></td> <td><input form="form1" type="text" name="DDDA" value="Ex: 75" /></td> <td><input form="form1" type="text" name="NumA" value="Ex: 982825441" /></td> <td><input form="form1" type="text" name="DtInit" value="Ex: 2018-01-01" /></td> <td><input form="form1" type="text" name="DtEnd" value="Ex: 2019-01-01" /></td> <td><input form="form1" type="submit" value="Enviar" /></td> E aqui está o código PHP:
      <?php $sDDDA = $_POST['DDDA']; $sNumA = $_POST['NumA']; $sDtInit = $_POST['DtInit']; $sDtEnd = $_POST['DtEnd']; $con = new PDO("mysql:host:IP;dbname=DB", "User", "Pass"); $stmt = $con->prepare("CALL NOC_cobranca_conecta_historico_msisdn(:qDDDA, :qNumA, :qDtInit, :qDtEnd) "); $stmt->bindParam(":qDDDA", $sDDDA, PDO::PARAM_STR, 3); $stmt->bindParam(":qNumA", $sNumA, PDO::PARAM_STR, 10); $stmt->bindParam(":qDtInit", $sDtInit, PDO::PARAM_STR, 12); $stmt->bindParam(":qDtEnd", $sDtEnd, PDO::PARAM_STR, 12); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); if ($result) { echo "OK"; } else { echo "NOK - Report Development Team"; } ?> No Apache ele fica logando o erro ' PHP Notice:  Undefined index: NumA in /var/www/html/Consulta/CallProc02.php' .
       
      Alguém pode me dizer oque estou fazendo errado?
       
      Obrigado desde já pela ajuda.
    • By User386_Denilson
      e aí pessoal, blz?
       
      Vou colocar aqui minha duvida...
      Tenho um projeto em net Core 2.2, usadon mongodb. Tenho uma collection antiga (Pessoas) que o pessoal foi alimentado com muita coisa, e agora estou organizando em pessoa fisica e pessoa juridica.
      Eu faço a busca usando o filtro por id:
      public async Task<PessoaDadosCad> GetPessoaFisica(string id) { var pessoa = await passaiMongoCollection.FindAsync(pessoa => pessoa.Id == id); var data = JsonConvert.SerializeObject(await pessoa.FirstOrDefaultAsync()); PessoaDadosCad simplifiedPerson = JsonConvert.DeserializeObject<PessoaDadosCad>(data.ToString()); return simplifiedPerson; }  
      (pessoa => pessoa.Id == id) ao executar esse comando de busca, a classe vinculada é Pessoa.
      Eu queria ver com vcs se tem como não vincular uma classe no momento da busca??
      Obrigado
×

Important Information

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