Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

आउटपुट पैरामीटर के साथ इकाई फ्रेमवर्क का उपयोग करके ओरेकल संग्रहीत प्रक्रिया को कॉल करना?

इस मामले में, आपको कॉल नहीं करना चाहिए:

var query = ctx.Database.SqlQuery<CmdRegisterAssetDto>(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam);

लेकिन इसके बजाय कॉल करें:

var result = ctx.Database.ExecuteSqlCommand(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam);

ध्यान दें कि एकमात्र प्रभावी अंतर यह है कि SqlQuery<CmdRegisterAssetDto> को ExecuteSqlCommand से बदल दिया गया था . इसका मतलब यह भी है कि डीटीओ अनावश्यक है। अन्यथा, आपका कोड ऐसा लगता है कि इसे काम करना चाहिए। मेरे द्वारा उल्लिखित परिवर्तनों के साथ आपका मूल कोड यहां दिया गया है:

string projectName = "EXCO";
string location = "ANYWHERE";
string countryCode = "XX";

using (var ctx = new RAContext())
{
    var projectNameParam = new OracleParameter("inProjectName", OracleDbType.Varchar2, projectName, ParameterDirection.Input);
    var countryCodeParam = new OracleParameter("inCountryCode", OracleDbType.Varchar2, countryCode, ParameterDirection.Input);
    var locationParam = new OracleParameter("inLocation", OracleDbType.Varchar2, location, ParameterDirection.Input);
    var assetRegisteredParam = new OracleParameter("OutAssetRegistered", OracleDbType.Varchar2, ParameterDirection.Output);

    var sql = "BEGIN RA.RA_RegisterAsset(:inProjectName, :inCountryCode, :inLocation, :OutAssetRegistered); END;";
    var result = ctx.Database.ExecuteSqlCommand(sql, projectNameParam, countryCodeParam, locationParam, assetRegisteredParam);

    assetRegistered = (string)assetRegisteredParam.Value;
}

अपने सिद्धांत को साबित करने के लिए, मैंने आपके द्वारा अनुभव किए जा रहे अशक्त व्यवहार को पुन:प्रस्तुत किया और फिर वह एक बदलाव किया। यह थोड़ी देर के लिए लटका हुआ था (शायद ईएफ को गियर में आने देने के लिए), लेकिन उसके बाद हर बार जल्दी से निष्पादित किया गया। प्रत्येक मामले में, मुझे आउट पैरामीटर में प्रतीक्षारत एक मान मिला।

अगर किसी को कोई परेशानी हो रही है, तो आपके लिए स्क्रिप्टिंग विवरण का ध्यान रखने वाला एक लंबा बदलाव है:

string projectName = "EXCO";
string location = "ANYWHERE";
string countryCode = "XX";

using (var ctx = new RAContext())
using (var cmd = ctx.Database.Connection.CreateCommand())
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "RA.RA_REGISTERASSET";

    var projectNameParam = new OracleParameter("inProjectName", OracleDbType.Varchar2, projectName, ParameterDirection.Input);
    var countryCodeParam = new OracleParameter("inCountryCode", OracleDbType.Varchar2, countryCode, ParameterDirection.Input);
    var locationParam = new OracleParameter("inLocation", OracleDbType.Varchar2, location, ParameterDirection.Input);
    var assetRegisteredParam = new OracleParameter("OutAssetRegistered", OracleDbType.Varchar2, ParameterDirection.Output);
    cmd.Parameters.AddRange(new[] { projectNameParam, countryCodeParam, locationParam, assetRegisteredParam });

    cmd.Connection.Open();
    var result = cmd.ExecuteNonQuery();
    cmd.Connection.Close();

    assetRegistered = (string)assetRegisteredParam.Value;
}

एक बाद के विचार के रूप में, आप तकनीकी रूप से अपने मूल समाधान के साथ जा सकते हैं यदि आपने तुरंत (यानी query.FirstOrDefault() के बाद क्वेरी को आमंत्रित किया है। ) क्वेरी का वापसी मूल्य हमेशा शून्य होगा, लेकिन आपका आउट पैरामीटर कम से कम पॉप्युलेट हो जाएगा। ऐसा इसलिए है क्योंकि EF क्वेरीज़ आस्थगित निष्पादन का उपयोग करती हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle व्यू में फ़िल्टर लागू करें

  2. Oracle:एक सबक्वेरी में कई परिणामों को एक अल्पविराम से अलग किए गए मान में संयोजित करें

  3. ORA 00918- कॉलम अस्पष्ट रूप से परिभाषित त्रुटि

  4. SQL उन सभी रिकॉर्ड के लिए चयन करता है जिनमें विशिष्ट मान हो सकता है

  5. ORA-00933:एकाधिक पंक्तियों को सम्मिलित करते समय SQL कमांड ठीक से समाप्त नहीं हुआ