【问题标题】:Calling Oracle Stored Procedure from C#从 C# 调用 Oracle 存储过程
【发布时间】:2014-04-19 16:53:54
【问题描述】:

我正在尝试从 C# 调用 oracle 存储过程“spValidateDBA”,但我总是收到错误消息 - “PLS-00306:调用“SPVALIDATEDBA”时参数的数量或类型错误” .

在尝试从 C# 调用存储过程参数“UserRole”时可能会出现此问题,它的类型在 C# 代码中设置不正确,我不知道如何正确设置。有人可以帮帮我吗在这里,我真的需要尽快解决这个问题。

C#代码:-

            string a = txtUsrId.Text.ToUpper();
            string sConnectionString = "Data Source=XE;User ID=sys;Password=system;DBA 
            PRIVILEGE=sysdba";
            OracleConnection myConnection = new OracleConnection(sConnectionString);
            OracleCommand myCommand = new OracleCommand("spValidateDBA", myConnection);
            myCommand.CommandType = CommandType.StoredProcedure;
            myCommand.CommandText = "spValidateDBA";
            myCommand.Parameters.Add("UserId", OracleDbType.Varchar2, 50);
            myCommand.Parameters["UserId"].Value = a;
            myCommand.Parameters.Add("UserRole",OracleDbType.Varchar2, 50).Direction =
            ParameterDirection.Output;
            myCommand.Parameters.Add("UserIdOut", OracleDbType.Varchar2, 50).Direction = 
            ParameterDirection.Output;
            var rolechk = false;
            string checkrole = "DBA";
            myConnection.Open();
            myCommand.ExecuteReader();
//this is where i'm getting the error "PLS-00306: wrong number 
//or types of arguments in call to 'SPVALIDATEDBA'"

存储过程 spValidateDBA

create or replace PROCEDURE spValidateDBA(
    UserId IN VARCHAR2,
UserRole OUT STRING_ARRAY,
 UserIdOut OUT VARCHAR2)
  AS
BEGIN
EXECUTE IMMEDIATE 'select GRANTED_ROLE bulk collect into UserRole from DBA_USERS DU,DBA_ROLE_PRIVS DRP where DU.USERNAME=UserId AND DU.USERNAME=DRP.GRANTEE';
EXECUTE IMMEDIATE 'select USERNAME into UserIdOut from DBA_USERS DU where DU.USERNAME=UserId';
  END spValidateDBA;

STRING_ARRAY 是此语句中声明的字符串数组类型:

CREATE TYPE STRING_ARRAY AS TABLE OF VARCHAR2(50);

如有任何问题,请告诉我。

【问题讨论】:

标签: c# sql oracle stored-procedures


【解决方案1】:

命令文本必须是这样的:

myCommand.CommandText = "spValidateDBA(:UserId, :UserRole, :UserIdOut )";

那么你必须调用myCommand.ExecuteNonQuery();而不是ExecuteReader。

myCommand.Parameters.Add("UserRole",OracleDbType.Varchar2, 50) 在返回 TABLE 而不是 VARCHAR 时也是错误的。我觉得应该和这个差不多:

myCommand.Parameters.Add("UserRole");
myCommand.Parameters["UserRole"].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
myCommand.Parameters["UserRole"].Direction = ParameterDirection.Output;

我从来没有使用PLSQLAssociativeArray 作为输出参数,所以我不确定细节。也许您的程序可以返回一个 SYS_REFCURSOR。

在您的 PL/SQL 过程中,我认为不需要动态 SQL,让它变得简单:

create or replace PROCEDURE spValidateDBA(
   UserId IN VARCHAR2, UserRole OUT STRING_ARRAY, UserIdOut OUT VARCHAR2)
  AS
 BEGIN
    select GRANTED_ROLE bulk collect into UserRole from DBA_USERS DU,DBA_ROLE_PRIVS DRP where DU.USERNAME=UserId AND DU.USERNAME=DRP.GRANTEE;
    select USERNAME into UserIdOut from DBA_USERS DU where DU.USERNAME= UserId';
 END spValidateDBA;

【讨论】:

  • 感谢朋友的建议,让我检查一次。
猜你喜欢
  • 2011-04-25
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 2012-01-27
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多