我知道这里有几个其他问题与完全相同的问题,但我100%肯定我没有任何类型的权限问题。该过程从查询编辑器执行正常,但由于某种原因,我无法从一个非常简单的ASP.net页面执行此proc。我应该注意这是我第一次尝试创建Oracle Proc。
这是我调用proc的代码(只是试图调用它并强制结果进入标签)
string oradb = "connection string here";
OracleConnection conn = new OracleConnection(oradb);
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "x.GETCURSORS";
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter ACTNUM = new OracleParameter();
ACTNUM.OracleDbType = OracleDbType.Decimal;
ACTNUM.Direction = ParameterDirection.Input;
ACTNUM.Value ="12345";
cmd.Parameters.Add(ACTNUM);
OracleParameter REJECTS_C = new OracleParameter();
REJECTS_C.OracleDbType = OracleDbType.RefCursor;
REJECTS_C.Direction = ParameterDirection.Output;
cmd.Parameters.Add(REJECTS_C);
try
{
conn.Open();
OracleDataReader objReader = cmd.ExecuteReader();
Label3.Text = objReader.ToString();
}
catch (Exception ex)
{
Label3.Text = string.Format("Exception: {0}", ex.ToString());
}
包装规格:
PACKAGE "x"."REJECTS_DATA" IS
PROCEDURE "GETCURSORS" (
"ACTNUM" IN NUMBER,
"REJECTS_C" OUT SYS_REFCURSOR);
END "REJECTS_DATA";
包体:
PACKAGE BODY "x"."REJECTS_DATA" IS
PROCEDURE "GETCURSORS" (
"ACTNUM" IN NUMBER,
"REJECTS_C" OUT SYS_REFCURSOR) IS
BEGIN
OPEN REJECTS_C FOR SELECT * FROM x.a
WHERE x.a.ACCOUNT = ACTNUM;
END "GETCURSORS";
END "REJECTS_DATA";
答案 0 :(得分:1)
假设架构名称为X
,程序包名称为REJECTS_DATA
,程序名称为GETCURSORS
,该命令至少需要
cmd.CommandText = "x.REJECTS_DATA.GETCURSORS";
如果您实际上在PL / SQL中使用区分大小写的标识符(我强烈建议避免使用),您还需要在过程名称中使用区分大小写的标识符。
答案 1 :(得分:0)
我们在代码中遇到了同样的问题,并且不得不让SCHEMA_NAME远离我们在C#中的proc调用,即PACKAGE_NAME.PROC_NAME。我们通过使用SCHEMA_NAME
在数据库中创建同义词来解决此问题