2011-06-15 15 views
6

मैं ऐसे उत्पाद का उपयोग कर रहा हूं जो ओरेकल फ़ंक्शंस के आधार पर डेटाबेस API प्रदान करता है और मैं सामान्य रूप से ODP.NET के माध्यम से फ़ंक्शंस कॉल करने में सक्षम हूं। हालांकि, मैं यह नहीं समझ सकता कि एक फ़ंक्शन को कैसे कॉल करें जिसमें रेफ कर्सर आउट-पैरामीटर के रूप में शामिल है। अब तक पाए गए सभी नमूने या तो आउट-पैरामीटर या रिफ कर्सर के साथ फ़ंक्शन मान के रूप में एक प्रक्रिया को कॉल करते हैं। मैंने पैरामीटर को समान रूप से परिभाषित करने का प्रयास किया, लेकिन त्रुटि प्राप्त करना जारी रखें कि गलत संख्या या पैरामीटर के प्रकार की आपूर्ति की जाती है।सी # से आउट पैरामीटर के रूप में एक रेफ कर्सर के साथ ओरेकल फ़ंक्शन को कैसे कॉल करें?

FUNCTION GetXYZ(
    uniqueId  IN somepackage.Number_Type, 
    resultItems OUT somepackage.Ref_Type) 
    RETURN somepackage.Error_Type; 

ये "somepackage" में टाइप परिभाषाएं दी गई हैं:

यहाँ समारोह हैडर (स्पष्ट रूप से समझ से परे) है

SUBTYPE Number_Type IS NUMBER(13); 
TYPE Ref_Type IS REF CURSOR; 
SUBTYPE Error_Type IS NUMBER; 

और यह कोड है कि मैं कोशिश की है है:

string sql = "otherpackage.GetXYZ"; 
var getXYZCmd = OracleCommand oracleConnection.CreateCommand(sql); 
getXYZCmd.CommandType = CommandType.StoredProcedure; 

getXYZCmd.Parameters.Add("uniqueId", OracleDbType.Int32).Value = uniqueExplosionId; 
getXYZCmd.Parameters.Add("resultItems", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 
getXYZCmd.Parameters.Add("return_value", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue; 

मैंने फ़ंक्शन को कॉल करने के लिए निम्नलिखित विभिन्न तरीकों का प्रयास किया (निश्चित रूप से केवल एक समय में):

var result = getXYZCmd.ExecuteNonQuery(); 
var reader = getXYZCmd.ExecuteReader(); 
var scalarResult = getXYZCmd.ExecuteScalar(); 

लेकिन उनमें से प्रत्येक त्रुटि संदेश के साथ विफल रहता है:

Oracle.DataAccess.Client.OracleException: ORA-06550: line 1, column 15: 
PLS-00306: wrong number or types of arguments in call to 'GETXYZ' 
ORA-06550: line 1, column 15: 
PLS-00306: wrong number or types of arguments in call to 'GETXYZ' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored. 

तो यह आम तौर पर ODP.NET के साथ सी # से बाहर पैरामीटर के रूप में एक रेफरी कर्सर के साथ एक समारोह कॉल करने के लिए संभव है? मैं बिना किसी समस्या के रेफ कर्सर के बजाय वर्चर 2-आउट-पैरामीटर के साथ एक ही संरचना के साथ एक फ़ंक्शन को कॉल कर सकता हूं ...

बीटीडब्ल्यू, मैं दृश्य में सी # .NET 3.5 से ODP.NET संस्करण 2.112.2.0 का उपयोग कर रहा हूं स्टूडियो 2008.

आपकी मदद के लिए अग्रिम धन्यवाद!

उत्तर

10

आप निश्चित रूप से कर सकते हैं। वहाँ से सावधान रहना करने के लिए कुछ gotchas रहे हैं, लेकिन यहां एक टेस्ट केस

create or replace function testodpRefCursor(
        uniqueId IN NUMBER 
       ,resultItems OUT NOCOPY SYS_REFCURSOR) RETURN NUMBER 
       IS 

BEGIN 
     OPEN resultItems for select level from dual connect by level < uniqueId ; 
     return 1; 
END testodpRefCursor; 
  1. मैं ने पाया है कि कार्यों संग्रह
  2. BindByName डिफ़ॉल्ट रूप से है में THE FIRST परम रूप ReturnValue के लिए पसंद करती है है गलत, तो यह चूक स्थिति से बाध्य करने के लिए

अन्यथा यह काफी सीधे आगे है:

उदाहरण के लिए
OracleCommand cmd = new OracleCommand("TESTODPREFCURSOR", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.BindByName = true; 
    // Bind 


    OracleParameter oparam = cmd.Parameters.Add("ReturnValue", OracleDbType.Int64); 
    oparam.Direction = ParameterDirection.ReturnValue ;  

    OracleParameter oparam0 = cmd.Parameters.Add("uniqueId", OracleDbType.Int64); 
    oparam0.Value = 5 ; 
    oparam0.Direction = ParameterDirection.Input; 

    OracleParameter oparam1 = cmd.Parameters.Add("resultItems", OracleDbType.RefCursor); 
    oparam1.Direction = ParameterDirection.Output; 




    // Execute command 
    OracleDataReader reader; 
    try 
    { 
    reader = cmd.ExecuteReader(); 

    while(reader.Read()){ 
     Console.WriteLine("level: {0}", reader.GetDecimal(0)); 
    } 

    } ... 
अधिक नमूनों के लिए

अब आप अपने Oracle होम निर्देशिका पर जाकर ODP.NET में @ रेफरी कर्सर नमूने देखने: % ओरेकल ग्राहक घर% \ odp.net \ नमूने \ 4 \ RefCursor

एचएच

+0

नमूने निर्देशिका प्रदान करने के लिए धन्यवाद। आपने दिन बचा लिया है:] –