【问题标题】:Why can't I execute the stored procedure? (OracleException was caught)为什么我不能执行存储过程? (OracleException 被捕获)
【发布时间】:2011-06-18 14:37:03
【问题描述】:

这是连接到 Oracle 数据库的代码。它在最后一行失败:dbDataAdapter.Fill(dtResult);

private object Execute(CommandType commandType, Common.DATA.SqlCommonExecutionType sqlCommonExecutionType, DbCommand dbCommand)

dbc = dbConnection.CreateCommand();
dbc.CommandType = commandType;
dbc.CommandText = dbCommand.CommandText;
dbc.CommandTimeout = 3600;

if (dbc.Connection.State == ConnectionState.Closed)
   dbc.Connection.Open();

DataTable dtResult = new DataTable();
DbDataAdapter dbDataAdapter = dbProviderFactory.CreateDataAdapter();
dbDataAdapter.SelectCommand = dbc;
dbDataAdapter.Fill(dtResult);

错误是“OracleRxception 被捕获:

ORA-06550: line 1, column 7:
PLS-00201: identifier 'RESETUNFINISHEDJOBS' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我可以通过 Oracle SQL*Plus 访问数据库。为什么我会收到此错误?数据库端缺少存储过程还是我的代码?关于如何解决这个问题的任何想法?

【问题讨论】:

  • SQL代码怎么样?至少到第 1 行,第 7 列
  • OracleRxception ==> OracleException

标签: c# oracle stored-procedures ora-06550


【解决方案1】:

您可能需要在命令文本中定义schema.package.storedprocedure(或schema.table

代替:

select * from table

用途:

select * from schema.table

...同样适用于函数/存储过程

如果你的 commandText 只包含存储过程:

storedprocedurename

试试:

schema.package.storedprocedurename

【讨论】:

    【解决方案2】:

    此外,您可能希望使用公共同义词。它通常是为对象创建公共同义词的更好方法,而不是显式使用所有者/模式方法。使用这种方法,这些对象的用户不必担心 schema.someObject 表示法。

    【讨论】:

    • 公共同义词会使使用同一个数据库处理多个应用程序变得困难,因为在公共名称空间中可能会发生冲突。我希望应用程序保留在它们自己的模式中,并且调用应用程序知道它们的模式名称,而不是污染公共名称空间。
    • 假设您对生产数据库环境有任何适当级别的更改控制(即,开发人员自己不创建/替换同义词),同义词不会污染任何东西。它们可以在各种情况下提供帮助,但当然不是完全必要的。
    • 问题是一个应用程序上的开发人员可能会创建一个名为 ADDRESSES 的表,但他们不知道另一个应用程序上的开发人员正在做同样的事情。或者更糟糕的是,这些应用程序可能是您无法控制任何来源的第三方。最好使用私有同义词和 ALTER SESSION SET CURRENT_SCHEMA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多