我想先在asp.net MVC代码中执行带参数的oracle pl/sql存储过程。
这是我的存储过程:
CREATE OR REPLACE
PROCEDURE sp_getuserhosps(p_city IN VARCHAR2,cnt OUT DECIMAL)
AS
BEGIN
SELECT COUNT(1) INTO cnt FROM "PersonStatus" p1
INNER JOIN HOSPITALS p2 ON P1."HospitalCode"=p2.KURUM_KODU
WHERE P2.IL_KODU=p_city AND p1."Statu"=1;
END;
这将返回 DBMS OUTPUT CNT=135555
,如下所示。
我尝试了这样的 Asp.Net MVC 代码:
var sql = "DECLARE cnt DECIMAL;BEGIN SP_GETUSERHOSPS(@p_city,cnt);END;";
var total = context.Database.ExecuteSqlCommand(sql, new OdbcParameter("@p_city","07"));
但是没有结果。并返回如下错误:
Cannot cast 'System.Data.Odbc.OdbcParameter' to 'Oracle.ManagedDataAccess.Client.OracleParameter'
我该如何解决这个问题?
谢谢
最佳答案
正如错误所述,您需要传递 Oracle.ManagedDataAccess.Client.OracleParameter
的实例,而不是 System.Data.Odbc.OdbcParameter
。
所以你会得到这个:
var sql = "DECLARE cnt DECIMAL;BEGIN SP_GETUSERHOSPS(:p_city,cnt);END;";
var total = context.Database.ExecuteSqlCommand(sql, new OracleParameter(":p_city","07"));
请注意,我将“@”字符替换为“:”字符。因为Oracle中的参数以后者为前缀,而SQL Server中则使用“@”前缀。
如果您想获取 cnt
值,请像这样重写代码:
var cntParameter = new OracleParameter("cnt", OracleDbType.Number, ParameterDirection.Output);
var cityParameter = new OracleParameter("p_city", OracleDbType.Number, "07", ParameterDirection.Input);
var sql = "BEGIN SP_GETUSERHOSPS(:p_city,:cnt);END;";
var total = context.Database.ExecuteSqlCommand(sql, cityParameter, cntParameter );
// Here you check the cntParameter.Value to get cnt parameter value.
关于c# - Asp.Net MVC 使用参数执行 Oracle PL/SQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39948685/