【问题标题】:Running Oracle stored procs from C#从 C# 运行 Oracle 存储过程
【发布时间】:2009-03-18 11:00:02
【问题描述】:

一个初学者的问题: 我在 Oracle 数据库中有一个存储过程(只是一个过程,没有任何包):

CREATE OR REPLACE procedure FII_DBO.CLEAR_UNIT_TEST_PRODUCT
IS
BEGIN
 ...
END CLEAR_UNIT_TEST_PRODUCT;

它在 TOAD 中运行良好。但是,当我尝试从 C# 运行它时,它会抱怨:

System.Data.OracleClient.OracleException: ORA-06550: line 1, column 7:
PLS-00201: identifier 'CLEAR_UNIT_TEST_PRODUCT' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

相关C#代码:

Command = new OracleCommand();
Command.CommandText = procedureName;
Command.CommandType = CommandType.StoredProcedure;
Command.Connection = connection;
Command.ExecuteNonQuery();

【问题讨论】:

    标签: c# .net oracle ora-06550


    【解决方案1】:

    检查与您的 .NET 应用程序连接的 Oracle 用户是否有权执行存储过程。

    【讨论】:

    • @Ian Nelson, @Grzenio - 我也有类似的问题。除了我使用ExecuteReader() 之外,相同的错误和 C# 代码看起来很相似。我看不出它怎么可能是权限,因为我连接的用户 ID 也是架构的所有者和特定的过程。还有其他可能发生这种情况的原因吗?
    【解决方案2】:

    找到了,错误信息有点误导。我以不同的用户身份执行它,他没有适当的访问权限。这成功了:

    grant execute on FII_DBO.CLEAR_UNIT_TEST_PRODUCT to FII_USER;
    

    【讨论】:

    • 是的,错误消息没有多大帮助,但我想这是出于安全目的。如果用户不能访问存储过程,那么数据库甚至不会承认它的存在。
    【解决方案3】:

    您是否在 procedureName 变量中包含包名?

    即将 procedureName 设置为“FII_DBO.CLEAR_UNIT_TEST_PRODUCT”,而不仅仅是“CLEAR_UNIT_TEST_PRODUCT”?

    【讨论】:

    • 是的,也试过了:必须声明标识符“FII_DBO.CLEAR_UNIT_TEST_PRODUCT”
    【解决方案4】:

    您的过程似乎是在另一个架构中创建的。

    问题

    ALTER SESSION SET CURRENT_SCHEMA = FII_DBO
    

    连接后。

    我记得提供程序在调用存储过程方面存在一些错误。

    将您的 CommandText 设置为

    BEGIN FII_DBO.CLEAR_UNIT_TEST_PRODUCT(); END;
    

    CommandTypeText

    您也可以尝试更改存储过程名称的大小写,例如:

    fii_dbo.clear_unit_test_product
    

    ,我记得案件也很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多