Ajuda com PL/SQL Dinâmico para executar no JAVA
-
- Rank: Programador Júnior
- Mensagens: 22
- Registrado em: Seg, 14 Out 2013 9:24 pm
Boa noite Srs, tenho uma package que insere, altera e deleta registros dinâmicamente onde os comandos para executar o pl/Sql estão no Java, porém eu estou com uma dúvida o comando SELECT dentro desta package no Sql Developer pelo menos retorna como "Bloco anônimo concluído!", apenas isso, a dúvida é se quando eu executar no Java isso vai retornar os valores normalmente, ou tenho que fazer alguma coisa a mais que retorne lá na aplicação Java. Obrigado!
-
- Rank: Programador Júnior
- Mensagens: 22
- Registrado em: Seg, 14 Out 2013 9:24 pm
esqueci de deixar notificar por e-mail. Obrigado!
- dr_gori
- Moderador
- Mensagens: 5013
- Registrado em: Seg, 03 Mai 2004 3:08 pm
- Localização: Portland, OR USA
- Contato:
Thomas F. G
Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered
Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered
To tentando entender.
Sua package faz uma série de comandos SELECT, UPDATE, DELETE.
Quando você roda no PLSQL Developer, ele executa.
No Java vai ser a mesma coisa.
Você espera que ela retorne algo? É isso ?
Sua package faz uma série de comandos SELECT, UPDATE, DELETE.
Quando você roda no PLSQL Developer, ele executa.
No Java vai ser a mesma coisa.
Você espera que ela retorne algo? É isso ?
-
- Rank: Programador Júnior
- Mensagens: 22
- Registrado em: Seg, 14 Out 2013 9:24 pm
Obrigado pela resposta. Exatamente, eu quero que retorne os valores consultados no SELECT no Java, por exemplo
Select * from minhaTabela
vai ter uma serie de registros, porém eu estou fazendo com SQL Dinâmico e ele está retornando "Bloco anônimo concluído", isso no SQL Developer, a pergunta é, "Como fazer para aparecer esses registros (tanto no Developer quanto no NetBeans), e para não aparecer como bloco anônimo e sim como se eu tivesse executado um select normal.???" Obrigado!- fbifabio
- Moderador
- Mensagens: 199
- Registrado em: Ter, 22 Fev 2011 1:51 pm
- Localização: São Paulo - SP
- Contato:
Fábio Prado
www.fabioprado.net
www.fabioprado.net
@leandro_bonato,
Quando você cria uma Stored Procedure (dentro ou fora de uma package) que executa um select, você precisa declarar um cursor (até o 11G) como parâmetro de saída para retornar os dados do SELECT e depois você precisa ler este cursor para ver os dados. Veja abaixo um exemplo que utilizo em meus treinamentos de PL/SQL:
Se for retornar os dados para uma aplicação, o passo 2 não é necessário. Aí é melhor você pegar um help com alguém que programa em Java e explicar o que você está usando e que você tem que fazer para pegar o retorno da procedure, ok?
[]s
Quando você cria uma Stored Procedure (dentro ou fora de uma package) que executa um select, você precisa declarar um cursor (até o 11G) como parâmetro de saída para retornar os dados do SELECT e depois você precisa ler este cursor para ver os dados. Veja abaixo um exemplo que utilizo em meus treinamentos de PL/SQL:
-- 1: criando a SP HR.SP_EMPREGADO_S
CREATE OR REPLACE PROCEDURE HR.SP_EMPREGADO_S(P_CR OUT SYS_REFCURSOR)
IS
BEGIN
OPEN P_CR FOR
SELECT FIRST_NAME, LAST_NAME FROM HR.EMPLOYEES;
END;
-- 2: chamando a SP HR.SP_EMPREGADO_S
SET SERVEROUTPUT ON
DECLARE
V_CURSOR SYS_REFCURSOR;
V_FN HR.EMPLOYEES.FIRST_NAME%TYPE;
V_LN HR.EMPLOYEES.LAST_NAME%TYPE;
BEGIN
HR.SP_EMPREGADO_S (V_CURSOR);
LOOP
FETCH V_CURSOR INTO V_FN, V_LN;
EXIT WHEN V_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_FN || ' ' || V_LN);
END LOOP;
CLOSE V_CURSOR;
END;
[]s
-
- Rank: Programador Júnior
- Mensagens: 22
- Registrado em: Seg, 14 Out 2013 9:24 pm
Obrigado pela resposta. Interessante, e no caso se eu tiver dentro da package no lugar de uma procedure uma function, então, como ela tem o retorno não é necessário um cursor? No caso o retorno é um %rowtype. Obrigado!
- fbifabio
- Moderador
- Mensagens: 199
- Registrado em: Ter, 22 Fev 2011 1:51 pm
- Localização: São Paulo - SP
- Contato:
Fábio Prado
www.fabioprado.net
www.fabioprado.net
Para retornar múltiplos valores em uma função, se você quiser utilizá-la em uma instrução SQL, pesquise por pipelined table function: http://www.fabioprado.net/2010/12/pipel ... -para.html.
[]s
[]s
-
- Rank: Programador Júnior
- Mensagens: 22
- Registrado em: Seg, 14 Out 2013 9:24 pm
Obrigado pela resposta! Eu acredito que este pipeline irá resolver o problema do JAVA também, se caso der certo eu postarei aqui e fecharei o tópico, caso não dê certo eu postarei o meu código aqui também. Obrigado!
-
- Rank: Programador Júnior
- Mensagens: 22
- Registrado em: Seg, 14 Out 2013 9:24 pm
Fabio muito bom seu site, quase deu certo, quando eu mandei consultar os registros da forma que você passou sem o SQL Dinâmico ele retornou os valores conforme eu solicitei, porém quando eu inseri o SQL dinâmico não deu erro na package, porém quando eu vou consultar no SELECT * FROM TABLE, ele retorna uma mensagem dizendo "Variable not in select list", gostaria de saber como faz esse seu método porém com sql dinâmico. Segue o que eu fiz. Obrigado!
--PKG HEAD
--PKG BODY
--PKG HEAD
TYPE ROWINCTYPE IS RECORD(CODINC VW_CONSULTA_INCIDENTES.CODINC%TYPE,
NOMINC VW_CONSULTA_INCIDENTES.NOMINC%TYPE,
CODSTA VW_CONSULTA_INCIDENTES.CODSTA%TYPE,
NOMSTA VW_CONSULTA_INCIDENTES.NOMSTA%TYPE,
NOMPRI VW_CONSULTA_INCIDENTES.NOMPRI%TYPE,
CODPRI VW_CONSULTA_INCIDENTES.CODPRI%TYPE,
NOMAREINC VW_CONSULTA_INCIDENTES.NOMAREINC%TYPE,
AREINC VW_CONSULTA_INCIDENTES.AREINC%TYPE,
NOMDEP VW_CONSULTA_INCIDENTES.NOMDEP%TYPE,
CODDEP VW_CONSULTA_INCIDENTES.CODDEP%TYPE,
NOMAREUSU VW_CONSULTA_INCIDENTES.NOMAREUSU%TYPE,
AREUSU VW_CONSULTA_INCIDENTES.AREUSU%TYPE,
DATINC VW_CONSULTA_INCIDENTES.DATINC%TYPE,
NOMATE VW_CONSULTA_INCIDENTES.NOMATE%TYPE,
NOMSOL VW_CONSULTA_INCIDENTES.NOMSOL%TYPE);
TYPE CONSULTA_INCIDENTES_TB IS TABLE OF ROWINCTYPE;
FUNCTION CONSULTAR_INCIDENTES (P_TABELAS VARCHAR2,
P_CAMPOS VARCHAR2,
P_CONDICOES VARCHAR2,
P_ORDENACAO VARCHAR2)
RETURN CONSULTA_INCIDENTES_TB PIPELINED;
--PKG BODY
FUNCTION CONSULTAR_INCIDENTES ( P_TABELAS VARCHAR2,
P_CAMPOS VARCHAR2,
P_CONDICOES VARCHAR2,
P_ORDENACAO VARCHAR2)
RETURN CONSULTA_INCIDENTES_TB PIPELINED IS
V_RECORD ROWINCTYPE;
WSQL VARCHAR2(4000) := 'SELECT ' || P_CAMPOS ||
' FROM ' || P_TABELAS ||
' WHERE 0=0 ' || P_CONDICOES ||
'ORDER BY ' || P_ORDENACAO;
TYPE C_INC IS REF CURSOR;
V_C_INC C_INC;
BEGIN
OPEN V_C_INC FOR (WSQL);
LOOP
FETCH V_C_INC Into V_RECORD;
EXIT WHEN V_C_INC%NOTFOUND;
PIPE ROW(V_RECORD);
END LOOP;
CLOSE V_C_INC;
RETURN;
END;
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes