2013-11-27 5 views
12

Oracle संग्रहीत प्रक्रिया (कर्सर समेत) से आउटपुट पैरामीटर प्राप्त करने और अपवाद प्राप्त करने के लिए Mule ESB में Groovy स्क्रिप्ट का उपयोग कर रहा हूं।ग्रोवी का उपयोग कर ओरेकल से कर्सर कैसे प्राप्त करें?

मिनिमल उदाहरण:

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) 

(org.mule.api.transformer.TransformerException) org.mule.module.scripting.transformer.ScriptTransformer:39 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerException.html) -------------------------------------------------------------------------------- Root Exception stack trace: java.sql.SQLException: Closed Statement at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199) + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything) ********************************************************************************

SelectCURSOR_TEST रिटर्न 1 और 2 से।

ओरेकल सर्वर संस्करण: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

धुंध संस्करण: 3.5.0

मैं ओरेकल क्लाइंट संस्करण 11.1.0.7.0 से jdbc\lib\ojdbc6.jar का उपयोग कर रहा हूं।

मैं क्या गलत कर रहा हूं?

+1

आप खच्चर के बाहर एक ग्रूवी लिपि में है कि कोड को चलाने के लिए कोशिश की? हटाए गए टिप्पणी में –

+0

@senia, आपने कहा है कि आपने इसके बजाय जावा कार्यान्वयन का उपयोग करके इस समस्या को हल किया है। क्या आप इस जावा कोड को अपने प्रश्न के उत्तर के रूप में पोस्ट कर सकते हैं और इसे स्वीकार कर सकते हैं? इससे हमें यह पता लगाने का मौका मिलेगा कि इस ग्रोवी कार्यान्वयन में क्या गलत था। –

+1

@ डेविडडॉसॉट: यहां [मेरा वर्कअराउंड उदाहरण] है (http://pastebin.com/XWAzXCU5)। मुझे नहीं लगता कि यह मेरे प्रश्न का एक अच्छा जवाब है, थोड़ी गड़बड़ी सहायता के साथ बस एक अच्छा पुराना जावा। – senia

उत्तर

1

निम्नलिखित कोड आपको Oracle अनाम ब्लॉक से SYS_REFCURSOR के चर प्राप्त करने में मदद कर सकता है।

हम कुछ महत्वपूर्ण विवरण पर ध्यान देना चाहिए:

  1. कक्षा groovy.sql.Sql इसी OutParameter नहीं है और हम CURSOR_PARAMETER के रूप में मैन्युअल रूप से इसे बनाने के लिए और यह sql.call विधि को पारित
  2. पर विचार करें कि ब्लॉक {call DECLARE साथ शुरू होता है और END के बाद अर्धविराम के बिना END } के साथ समाप्त होता है। अन्यथा हम चेहरे में एक खराब पहचानने योग्य SQLException प्राप्त कर सकते हैं।
  3. प्रश्न ?sqlString के अंदर पैरामीटर बाइंडिंग के लिए स्थान हैं। बाइंडिंग प्राकृतिक क्रम में बनाई जाती हैं।
    • पहले ?parametersList में पहला तत्व के साथ बांध: इस उदाहरण में, "abc"IN पैरामीटर के रूप में मूल्य के इलाज;
    • दूसरा ? CURSOR_PARAMETER के साथ बाइंड्स को OUT पास प्रकार के पैरामीटर के रूप में मानते हुए;
  4. केवल एक बंद में प्रवेश 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") 
    } 
}; 
+0

क्या हम यहां स्ट्रिंग इंटरपोलेशन का उपयोग कर सकते हैं? स्ट्रिंग इंटरपोलेशन के बिना यह [वर्कअराउंड] (http://pastebin.com/XWAzXCU5) से बेहतर नहीं है। वैसे, मैं आपके समाधान का परीक्षण नहीं कर सकता। मेरे पास ओरेकल डीबी इंस्टेंस तक कोई पहुंच नहीं है। – senia

+0

यहां मुख्य विशेषता कस्टम 'आउट पैरामीटर' है, और समाधान के अन्य हिस्सों में सामान्य ग्रूवी सामान हैं। मैंने आपके द्वारा पूछे जाने वाले परिणाम प्राप्त करने का केवल सबसे छोटा तरीका दिखाया। तो, हाँ, हम स्ट्रिंग इंटरपोलेशन का उपयोग कर सकते हैं। और मुझे आश्चर्य है कि आपको ओरेकल डीबी उदाहरण की कमी है हालांकि सवाल 'ऑरैकल' टैग किया गया है। आप मुझे इसके बारे में क्या करने का अनुमान लगाते हैं? – diziaq

+0

कुछ भी नहीं। मेरा मतलब है: मैं परीक्षण के बिना आपका जवाब स्वीकार नहीं कर सकता। मैं अगले सप्ताहांत का परीक्षण करने की कोशिश करूंगा। प्रश्न नाटकीय रूप से पुराना है। यह 3 साल पुराना है। – senia

संबंधित मुद्दे