c# - PL/SQL 问题返回序列标量值

标签 c# oracle stored-procedures plsql

我正在尝试从存储在包中的过程将 sequence.nextval 返回到我的程序。当涉及到 PL/SQL 时,我还很陌生,我对正在发生的事情有点不知所措。实际返回的错误是

PLS-00306:调用 PROCGET_BOOKMARKID 第 1 行第 7 列语句时参数的数量或类型错误。

这是我的包创建代码...

create or replace
package BOOKMARKS AUTHID DEFINER is
  type t_Bookmark is ref cursor;

  procedure procGet_Bookmarked_Information(bookmarkId in NUMBER, bookmark out t_Bookmark);
  procedure procInsert_Bookmark(bookmarkId in NUMBER, currExtent in VARCHAR2, selectedLayers in VARCHAR2);
  procedure procGet_Bookmark_Id(bookmarkId out NUMBER);

end BOOKMARKS; 

And the proc for get_bookmark_id looks like this (the other procs work fine so I'm not going to post them)...


  procedure procGet_Bookmark_Id(bookmarkId out NUMBER)
  IS
  BEGIN
    SELECT seq_bookmarks.nextval INTO bookmarkId
      FROM dual;

  END procGet_Bookmark_Id;

现在,我确定这不是我的序列。如果我通过这样做直接从我的代码中查询数据库,我可以获得 nextval...


string sql = string.Format(@"select {0}.seq_bookmarks.nextval from dual", ApplicationSchema);

在这种情况下,应用程序模式就是我要连接的数据库。

所以,在我看来,问题完全出在我的 PL/SQL 中,这是有道理的,因为我几乎没有使用过它。有什么想法吗?

编辑 好的,下面是实际进行调用的代码。


DataOperationResult result = DataAccess.GetBookmarkId();
DataRow currResult = result.DataTableResult.Rows[0];

其中 DataAccess 是一个查询类,下面是这个特定查询的代码。


string sql = string.Format("{0}.bookmarks.procGet_Bookmark_Id", ApplicationSchema);
DataOperation operation = new DataOperation(DataOperationType.ExecuteScalar, ConnectionString, System.Data.CommandType.StoredProcedure, sql);
return operation.PerformOperation();

Application Schema就是我们要查询的数据库。 ExecuteScalar 有点啰嗦,它是我没有编写的代码,应该假定它可以工作(假定关键字)。希望这足以了解正在发生的事情。

最佳答案

我刚刚在 PL/SQL Developer 中编译了你的包,它工作正常。

问题似乎与您的 C# 代码中的数据类型有关。

从我在描述中看到的,您没有绑定(bind)任何参数。您应该在代码中的某处绑定(bind)参数,例如

OracleParameter bid = new OracleParameter("bookmarkID", OracleDbType.Number);
bid.Direction = ParameterDirection.Output;
command.Parameters.Add(bid);

如果您需要处理很多抽象,您可以将过程重新定义为函数:

FUNCTION procGet_Bookmark_Id RETURN INTEGER
IS
  res INTEGER;
BEGIN
  SELECT seq_bookmarks.nextval
  INTO res
  FROM dual;
  RETURN res;
END procGet_Bookmark_Id;

并在 SELECT 查询中调用它:

SELECT bookmarks.procGet_Bookmark_id FROM dual;

,你似乎可以做到。

关于c# - PL/SQL 问题返回序列标量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/529654/

相关文章:

c# - 尝试使用时查询字符串会发生变化。

c# - 在 WCF 服务应用程序项目中初始化?

oracle - 是否可以验证应用程序中的所有 SQL 表达式?

mysql - 删除 SQL 数据库表中的多个条目。正确的查询?

具有空主体的 SQL Server 存储过程

c# - 在 .NET 哈希表(或其他结构)中获取最接近/下一个匹配项

c# - 创建动态表时应用 Css 样式

oracle - ORA-01855 : AM/A. M. 或 PM/P.M.必需的

mysql - 从 select 语句 mysql 调用用户定义的存储过程

mysql - 如何获取执行用户MySQL的存储过程