我正在尝试从存储在包中的过程将 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/