我正在尝试将sequence.nextval从存储在包中的proc返回到我的程序。在谈到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;
get_bookmark_id的proc看起来像这样(其他proc工作正常,所以我不打算发布它们)......
procedure procGet_Bookmark_Id(bookmarkId out NUMBER)
IS
BEGIN
SELECT seq_bookmarks.nextval INTO bookmarkId
FROM dual;
END procGet_Bookmark_Id;
现在,我确定这不是我的序列。如果我直接从我的代码中查询db,我可以得到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是一种啰嗦的代码,我编写的代码应该被认为是可行的(假定关键字)。希望这足以让我知道发生了什么。
答案 0 :(得分:6)
我刚刚编译了你的包,在PL/SQL Developer
它工作正常。
问题似乎与C#
代码中的数据类型有关。
从我在描述中看到的,你没有绑定任何参数。您应该在代码中的某处绑定参数,例如
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;
,你似乎能够做到。
答案 1 :(得分:2)
错误:“调用blah的参数数目错误”是指调用代码中的错误,而不是被调用的代码。
您应该检查以下内容:
答案 2 :(得分:1)
我相信您需要传入.net代码中的参数。您在.net代码和过程定义中为参数提供的名称必须相同。
-OR -
使用PL / SQL函数代替过程。您根本不需要使用参数。
编辑:假设您使用的是Microsoft提供程序,则需要返回参数。这是.net代码。
// proc is the procedure name, oraConn is the oracle connection
OracleCommand cmd = new OracleCommand(proc, oraConn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
OracleParameter ret = new OracleParameter();
ret.Direction = System.Data.ParameterDirection.ReturnValue;
ret.OracleType = OracleType.Number;
cmd.Parameters.Add(ret);