2011-08-21 15 views
8

से ओरेकल ऑब्जेक्ट-ओरिएंटेड पीएल/एसक्यूएल सदस्य प्रक्रियाओं को कॉल करें ऑब्जेक्ट उन्मुख पीएल/एसक्यूएल में, मैं सदस्य प्रक्रियाओं और कार्यों को प्रकारों में जोड़ सकता हूं। एक उदाहरण यहाँ दिया जाता है:जेडीबीसी

create type foo_type as object (
    foo number, 

    member procedure proc(p in number), 
    member function func(p in number) return number 
); 

create type body foo_type as 
    member procedure proc(p in number) is begin 
    foo := p*2; 
    end proc; 

    member function func(p in number) return number is begin 
    return foo/p; 
    end func; 
end; 

से: http://www.adp-gmbh.ch/ora/plsql/oo/member.html

PL/SQL में, मैं तो इन सदस्य प्रक्रियाओं कॉल कर सकते हैं/इस तरह कार्य:

declare 
    x foo_type; 
begin 
    x := foo_type(5); 
    x.proc(10); 
    dbms_output.put_line(x.func(2)); 
end; 

मैं यह कर कैसे कर सकते हैं के साथ जेडीबीसी का कॉल करने योग्य स्टेटमेंट? मुझे यह दस्तावेज़ीकरण में आसानी से नहीं मिल रहा है।

नोट: यह एक संभावना है प्रकार निर्माता को इनलाइन:

CallableStatement call = c.prepareCall(
    " { ? = call foo_type(5).func(2) } "); 

लेकिन क्या मैं के लिए देख रहा हूँ कुछ इस तरह है (एक पैरामीटर के रूप java.sql.SQLData उपयोग करते हुए):

CallableStatement call = c.prepareCall(
    " { ? = call ?.func(2) } "); 

इसके अलावा, सदस्य कार्य, प्रक्रियाएं वस्तु को संशोधित कर सकती हैं। जावा में संशोधित ऑब्जेक्ट को वापस कैसे प्राप्त किया जा सकता है?

+0

अपने प्रश्न के मूल वास्तव में है "सदस्य फ़ंक्शन कैसे कॉल करें"? या यह "ऑब्जेक्ट को पैरामीटर के रूप में कैसे पास करें" है? – Codo

+0

@ कोडो: कोर सदस्य कार्य परिणामों को पुनर्प्राप्त करने का तरीका है (उदाहरण विन्सेंट मालगेट द्वारा दिया गया उत्तर), और संभवतः संशोधित ऑब्जेक्ट को –

उत्तर

4

jdbc में आप out चर के साथ पीएल/एसक्यूएल ब्लॉक को पार्स और निष्पादित कर सकते हैं।

declare 
    x foo_type; 
begin 
    x := foo_type(5); 
    x.proc(10); 
    ? := x.func(2); 
end; 

तो फिर तुम CallableStatement.registerOutParameter उपयोग कर सकते हैं और बाद में बयान निष्पादित किया गया है, उचित get फ़ंक्शन का उपयोग मान प्राप्त करने के लिए: आप इस तरह के रूप में एक प्रतिदेय बयान तैयार कर सकता है।

आप जावा में सीधे FOO_TYPE प्रकार सीधे एक्सेस कर सकते हैं, लेकिन क्या आप वाकई ऐसा करना चाहते हैं? एक काम उदाहरण के लिए नीचे देखें:

SQL> create or replace and compile java source named "TestOutParam" as 
    2 import java.sql.*; 
    3 import oracle.sql.*; 
    4 import oracle.jdbc.driver.*; 
    5 
    6 public class TestOutParam { 
    7 
    8  public static int get() throws SQLException { 
    9 
10  Connection conn = 
11   new OracleDriver().defaultConnection(); 
12 
13  StructDescriptor itemDescriptor = 
14   StructDescriptor.createDescriptor("FOO_TYPE",conn); 
15 
16  OracleCallableStatement call = 
17   (OracleCallableStatement) conn.prepareCall("declare\n" 
18    + " x foo_type;\n" 
19    + "begin\n" 
20    + " x := foo_type(5);\n" 
21    + " x.proc(10);\n" 
22    + " ? := x;\n" 
23    + "end;\n"); 
24 
25  call.registerOutParameter(1, OracleTypes.STRUCT, "FOO_TYPE"); 
26 
27  call.execute(); 
28 
29  STRUCT myObj = call.getSTRUCT(1); 
30 
31  Datum[] myData = myObj.getOracleAttributes(); 
32 
33  return myData[0].intValue(); 
34 
35  } 
36 } 
37/

यह एक परीक्षण वर्ग कैसे आप एक एसक्यूएल वस्तु पर विधि registerOutParameter उपयोग कर सकते हैं दिखाने के लिए है, चलो इसे कहते हैं:

SQL> CREATE OR REPLACE 
    2 FUNCTION show_TestOutParam RETURN NUMBER 
    3 AS LANGUAGE JAVA 
    4 NAME 'TestOutParam.get() return java.lang.int'; 
    5/

Function created 

SQL> select show_testoutparam from dual; 

SHOW_TESTOUTPARAM 
----------------- 
       20 
+1

डुह पुनर्प्राप्त कैसे करें। मैंने जेडीबीसी एस्केप सिंटैक्स के बजाय वास्तव में पीएल/एसक्यूएल को डेटाबेस में पास करने के बारे में नहीं सोचा था ... क्या आपके पास कोई विचार है कि पीएल/एसक्यूएल ब्लॉक से 'x' खुद को कैसे वापस किया जा सकता है? इस उदाहरण में, प्रक्रियाओं/कार्यों द्वारा 'x' संशोधित नहीं किया गया है। लेकिन यह हो सकता है। तो जब 'x.func (2)' को कॉल करते समय, मैं आपके उदाहरण * और * 'x' के अद्यतन मान के रूप में 'java.sql.SQLData'' के रूप में फ़ंक्शन परिणाम दोनों चाहता हूं ... –

+1

आप कर सकते हैं पीएल/एसक्यूएल से सीधे जावा स्ट्रक्चर में एसक्यूएल ऑब्जेक्ट्स पुनर्प्राप्त करें (उदाहरण [यहां] (http://stackoverflow.com/questions/3626061/how-to-call-oracle-stored-procedure-which-include-user-defined-type -इन-जावा)) हालांकि, मुझे हमेशा लगता है कि यह थोड़ा उलझन में है: मेरा अद्यतन उत्तर देखें। –

+1

बहुत बढ़िया! हाँ, मैं यह करना चाहता हूं। इसका मुख्य रूप से मेरे [डेटाबेस एब्स्ट्रक्शन लाइब्रेरी] (http://www.jooq.org) में उपयोग किया जाएगा। आपने इसे देखा होगा, क्योंकि आपने पहले मेरे प्रश्नों का उत्तर दिया है :-)। लक्ष्य यूडीटी और जावा कक्षाओं के बीच मैपिंग बनाना होगा। यह पहले से मौजूद है, लेकिन केवल यूडीटी के डेटा के लिए ही हो सकता है। सदस्य फ़ंक्शंस और प्रक्रियाओं के लिए जावा स्रोत कोड जेनरेट करना और भी दिलचस्प है, क्योंकि इससे जावा और पीएल/एसक्यूएल के बीच क्लाइंट कोड के लिए बहुत आसान बातचीत होगी, क्योंकि उन्हें इस तरह की जेडीबीसी चाल के साथ गड़बड़ नहीं है। आपकी सहायता के लिए धन्यवाद। –

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