Ajuda com PL/SQL Dinâmico para executar no JAVA

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
leandro_bonato
Rank: Programador Júnior
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!
leandro_bonato
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Seg, 14 Out 2013 9:24 pm

esqueci de deixar notificar por e-mail. Obrigado!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
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

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 ?
leandro_bonato
Rank: Programador Júnior
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!
Avatar do usuário
fbifabio
Moderador
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

@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:

Selecionar tudo

-- 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;

Selecionar tudo

-- 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;
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
leandro_bonato
Rank: Programador Júnior
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!
Avatar do usuário
fbifabio
Moderador
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

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
leandro_bonato
Rank: Programador Júnior
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!
leandro_bonato
Rank: Programador Júnior
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

Selecionar tudo

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

Selecionar tudo

 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;
Responder
  • Informação