Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Memanggil prosedur tersimpan Oracle menggunakan Entity Framework dengan parameter output?

Dalam hal ini, Anda tidak boleh menelepon:

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

Tapi malah menelepon:

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

Perhatikan bahwa satu-satunya perbedaan yang efektif adalah SqlQuery<CmdRegisterAssetDto> diganti dengan ExecuteSqlCommand . Ini juga berarti bahwa DTO tidak diperlukan. Jika tidak, kode Anda sepertinya akan berfungsi. Berikut kode asli Anda secara keseluruhan dengan perubahan yang saya sebutkan:

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;
}

Untuk membuktikan teori saya, saya mereproduksi perilaku nol yang Anda alami dan kemudian membuat satu perubahan itu. Itu tergantung sebentar (mungkin untuk membiarkan EF bekerja), tetapi kemudian dieksekusi dengan cepat setiap kali sesudahnya. Dalam setiap kasus, saya menemukan nilai menunggu di parameter keluar.

Jika ada orang di luar sana yang mengalami masalah, ada variasi tulisan tangan yang menangani detail skrip untuk Anda:

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;
}

Sebagai renungan, Anda secara teknis dapat menggunakan solusi asli Anda jika Anda memanggil kueri segera setelahnya (yaitu query.FirstOrDefault() ). Nilai kembalian kueri akan selalu nol, tetapi parameter keluar Anda setidaknya akan terisi. Ini karena kueri EF menggunakan eksekusi yang ditangguhkan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00922:opsi hilang atau tidak valid saat mengeksekusi pernyataan 100000 yang panjang di Oracle

  2. Mengapa fungsi agregat tidak diizinkan di klausa where

  3. Literal tidak cocok dengan format string untuk Oracle SQL to_date pada kolom string

  4. Membuat pemicu yang menghasilkan nilai kolom ID sebelum dimasukkan saat tabel baru dibuat

  5. Utilitas:Menghasilkan Prosedur PL/SQL untuk Mengekspor Data Dari Tabel dalam 2 Menit