그루비를 사용하여 오라클에서 커서를 가져오는 방법은 무엇입니까?
사용 중입니다.Groovy
대본을 작성하다.Mule ESB
출력 매개 변수를 가져오다Oracle
저장 프로시저(커서 포함) 및 예외 가져오기.
최소 예제:
import groovy.sql.Sql
import oracle.jdbc.pool.OracleDataSource
import oracle.jdbc.driver.OracleTypes
def ds = new OracleDataSource()
// setting data source parameters here
def sql = new Sql(ds)
def data = []
sql.call("""declare
result_table sys_refcursor;
begin
open result_table for select 1 as a from dual;
insert into CURSOR_TEST (ID) values (1);
commit;
${Sql.resultSet OracleTypes.CURSOR} := result_table;
insert into CURSOR_TEST (ID) values (2);
commit;
end;
"""
){ table ->
throw new RuntimeException("Never getting this exception.")
table.eachRow {
data << it.toRowResult()
}
}
sql.close()
return data
오류:
Message : java.sql.SQLException: Closed Statement (javax.script.ScriptException) Code : MULE_ERROR--2 -------------------------------------------------------------------------------- Exception stack is: 1. Closed Statement(SQL Code: 17009, SQL State: + 99999) (java.sql.SQLException) oracle.jdbc.driver.SQLStateMapping:70 (null) 2. java.sql.SQLException: Closed Statement (javax.script.ScriptException) org.codehaus.groovy.jsr223.GroovyScriptEngineImpl:323 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/script/ScriptException.html) 3. java.sql.SQLException: Closed Statement (javax.script.ScriptException)
(vmdk.sys.api.syser).TransformerException) org.mule.module.scripting.transformer.ScriptTransformer:39(http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerException.html) ----------------------------------------- 루트 예외 스택 추적: java.sql.SQL 예외:oracle.jdbc.driver에서 문을 닫았습니다.SQL 상태 매핑.newSQoracle.jdbc.driver의 LEexception(SQLStateMapping.java:70).데이터베이스 오류.newSQoracle.jdbc.driver에서 LEexception(DatabaseError.java:133).데이터베이스 오류입니다.slowSqlException(DatabaseError.java:199) + 3개(디버깅 수준 로깅 또는 '-Dmule.verbose 설정).예외=모든 것에 대해 true')*************************************************
Select
부터CURSOR_TEST
돌아온다1
그리고.2
.
Oracle 서버 버전:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
.
뮬 버전:3.5.0
.
사용 중jdbc\lib\ojdbc6.jar
Oracle 클라이언트 버전에서11.1.0.7.0
.
내가 뭘 잘못하고 있는 거지?
다음 코드는 변수를 얻는 데 도움이 될 수 있습니다.SYS_REFCURSOR
오라클 익명 블록에서.
몇 가지 주요 세부 사항에 중점을 두어야 합니다.
- 학급
groovy.sql.Sql
해당되지 않습니다.OutParameter
그리고 우리는 그것을 수동으로 만듭니다.CURSOR_PARAMETER
에 전달합니다.sql.call
방법 - 블록이 다음으로 시작한다고 가정합니다.
{call DECLARE
로 끝납니다.END }
종료 후 세미콜론이 없는 경우그렇지 않으면 인지도가 떨어질 수 있습니다.SQLException
면전에서 - 물음표
?
내부에sqlString
매개 변수 바인딩을 위한 위치입니다.바인딩은 자연스러운 순서로 만들어집니다.이 예제에서는 다음을 수행합니다.- 제1의
?
의 첫 번째 요소와 바인딩됨parametersList
:"abc"
가치를 취급하기IN
매개변수; - 제2의
?
값을 다음으로 처리하는 CURSOR_PARAMETER로 바인딩합니다.OUT
전달된 유형의 매개변수
- 제1의
- 다음 이후에 하나만 종료됩니다.
sql.call
그리고.ResultSet rs
커서 행 제공my_cur
익명 블록으로 선언되었습니다.
import groovy.sql.OutParameter
import groovy.sql.Sql
import oracle.jdbc.OracleTypes
import java.sql.ResultSet
def driver = 'oracle.jdbc.driver.OracleDriver'
def sql = Sql.newInstance('jdbc:oracle:thin:@MY-SERVER:1521:XXX', 'usr', 'psw', driver)
// special OutParameter for cursor type
OutParameter CURSOR_PARAMETER = new OutParameter() {
public int getType() {
return OracleTypes.CURSOR;
}
};
// look at some ceremonial wrappers around anonymous block
String sqlString = """{call
DECLARE
my_cur SYS_REFCURSOR;
x VARCHAR2(32767) := ?;
BEGIN
OPEN my_cur
FOR
SELECT x || level AS my_column FROM dual CONNECT BY level < 10;
? := my_cur;
END
}
""";
// the order of elements matches the order of bindings
def parametersList = ["abc", CURSOR_PARAMETER];
// rs contains the result set of cursor my_cur
sql.call(sqlString, parametersList) { ResultSet rs ->
while (rs.next()) {
println rs.getString("my_column")
}
};
언급URL : https://stackoverflow.com/questions/20242512/how-to-get-cursor-from-oracle-using-groovy
'programing' 카테고리의 다른 글
Tomcat에서 배포되지 않은 메모리 누수를 방지할 수 있는 방법이 있습니까? (0) | 2023.08.22 |
---|---|
CSS 크로스 브라우저로 수직 텍스트를 어떻게 그릴 수 있습니까? (0) | 2023.08.22 |
본문 매개변수가 '@'로 시작하는 경우 PowerShell POST 요청 (0) | 2023.08.12 |
Apple FFT 및 Accelerate Framework 사용 (0) | 2023.08.12 |
글꼴 스타일: CSS에서 기울임꼴 대 사선 (0) | 2023.08.12 |