Oracle (11g) 기반 응용 프로그램에서는 파이프 라인 기능을 많이 사용하고 있습니다. 이제는 아래 함수 (컷 다운)에 표시된 것처럼 이러한 함수에서 발생한 오류보고가 어렵다는 것이 밝혀졌습니다. 프로 시저가 Java에서 호출되도록 존재하며 PL/SQL 실행 중에 어디에서나 오류가 발생합니다.Java에서 호출 된 파이프 라인 된 함수에서 PL/SQL 오류를 잡는 방법
ORACLE 부 :
set serveroutput on
create table dummy (id NUMBER);
create or replace package mytest
as
type t_rec is record (id integer);
type t_tab is table of t_rec;
type t_ref_cur IS REF CURSOR RETURN t_rec;
function foo
return t_tab pipelined;
procedure bar(p_ref_cur out t_ref_cur);
end mytest;
/
show errors
create or replace package body mytest
as
function foo
return t_tab pipelined
is
v_cur SYS_REFCURSOR;
v_sql varchar2(2000);
v_rec t_rec;
begin
v_sql := 'select wrong_column from DUMMY';
open v_cur for v_sql;
loop
fetch v_cur into v_rec;
exit when v_cur%notfound;
pipe row (v_rec);
end loop;
exception
when no_data_needed then
null;
when others then
dbms_output.put_line(SQLCODE||' '||sqlerrm);
raise no_data_found;
end foo;
procedure bar(p_ref_cur out t_ref_cur)
is
begin
open p_ref_cur for select * from table(foo);
end bar;
end mytest;
/
show errors
-- call procedure bar() from pl/sql
set serveroutput on
declare v_ref_cur mytest.t_ref_cur;
v_rec mytest.t_rec;
begin
mytest.bar(v_ref_cur);
loop
fetch v_ref_cur into v_rec;
exit when v_ref_cur%notfound;
dbms_output.put_line(v_rec.id);
end loop;
end;
/
show errors
예외에서 상기 함수 결과를 실행 도시되고 :
ORA-00904: "WRONG_COLUMN": invalid column name
자바 부 :
package test1;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import oracle.jdbc.OracleTypes;
public class start {
public static void main(String[] args)
{
try
{
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@...", "…", "…");
CallableStatement stmt = con.prepareCall("BEGIN mytest.bar(?); END;");
stmt.registerOutParameter(1, OracleTypes.CURSOR);
stmt.executeQuery();
ResultSet rs = (ResultSet)stmt.getObject(1);
while (rs.next())
{
System.out.println(rs.getInt(1));
}
stmt.close();
con.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
예외없는 것 기음 찌르다. ResultSet이 비어 있습니다.
이것은 예상되는 동작입니까? 우리가 뭔가 잘못 했니? 해결 방법이 있습니까?