在C#中运行Oracle存储过程

3
一个初学者的问题: 我在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();
4个回答

3

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


@Ian Nelson,@Grzenio - 我有一个类似的问题。同样的错误,C#代码看起来很相似,除了我正在使用ExecuteReader()。我不明白它可能是权限问题,因为我连接的用户ID是模式和特定过程的所有者。还有其他原因可能会发生这种情况吗? - one.beat.consumer

1
找到问题所在了,原来错误提示信息有些误导人。我是以另一个没有适当访问权限的用户身份来执行的,现在已经解决了,这是解决方法:
grant execute on FII_DBO.CLEAR_UNIT_TEST_PRODUCT to FII_USER;

1
是的,错误信息并不是很有用,但我猜想这么做是出于安全考虑。如果用户无法访问存储过程,那么数据库甚至不会承认它的存在。 - Ian Nelson

0

您的程序似乎是在另一个模式中创建的。

问题

ALTER SESSION SET CURRENT_SCHEMA = FII_DBO

连接后立即执行。

我记得这个提供程序在调用存储过程时有一些错误。

将您的CommandText设置为

BEGIN FII_DBO.CLEAR_UNIT_TEST_PRODUCT(); END;

CommandType转换为Text

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

fii_dbo.clear_unit_test_product

我记得大小写也很重要。


0

你在 procedureName 变量中包含包名吗?

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


是的,我也尝试过了:标识符“FII_DBO.CLEAR_UNIT_TEST_PRODUCT”必须声明。 - Grzenio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接