有了这个
PROCEDURE "ADD_BOOKMARK_GROUP" (
"NAME" IN VARCHAR2,
"BOOKMARK_GROUP_ID" IN NUMBER,
"STAFF_ID" IN VARCHAR2,
"MAX_NO" IN INT,
"NUMFOUND" OUT INT,
"NEW_ID" OUT NUMBER) IS
BEGIN
NEW_ID := -1;
SELECT COUNT(*) INTO NUMFOUND FROM BOOKMARK_GROUP_TABLE WHERE STAFF_ID = STAFF_ID;
IF NUMFOUND < MAX_NO THEN
INSERT INTO BOOKMARK_GROUP_TABLE (NAME, BOOKMARK_GROUP_ID, STAFF_ID) VALUES(NAME, BOOKMARK_GROUP_ID, STAFF_ID);
SELECT BGT_SEQUENCE.currval INTO NEW_ID FROM dual;
END IF;
END;
我觉得有趣的是,如果我不按照定义的顺序添加参数,例如
OracleCommand cmd = new OracleCommand("ADD_BOOKMARK_GROUP", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("NAME", name));
...
cmd.Parameters.Add(new OracleParameter("NEW_ID", OracleDbType.Decimal)).Direction = ParameterDirection.Output;
cmd.Parameters.Add(new OracleParameter("NUMFOUND", OracleDbType.Int32)).Direction = ParameterDirection.Output;
而不是
OracleCommand cmd = new OracleCommand("ADD_BOOKMARK_GROUP", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("NAME", name));
...
cmd.Parameters.Add(new OracleParameter("NUMFOUND", OracleDbType.Int32)).Direction = ParameterDirection.Output;
cmd.Parameters.Add(new OracleParameter("NEW_ID", OracleDbType.Decimal)).Direction = ParameterDirection.Output;
返回的值
cmd.Parameters["NEW_ID"].Value.ToString()
和
cmd.Parameters["NUMFOUND"].Value.ToString()
交换,尽管通过VS2008 Server Explorer运行该过程会返回正确的数据。
为什么会这样?
答案 0 :(得分:31)
您可以在OracleCommand对象上设置BindByName参数。这适用于带参数的直接SQL查询,我没有尝试使用存储过程,但它是合乎逻辑的......
cmd.BindByName = true;
答案 1 :(得分:10)
我不是Oracle buff,所以我无法验证 - 但它听起来就像是按位置传递(而不是按名称传递)。道德等同于:
EXEC SomeProc 'Foo', 'Bar'
而不是:
EXEC SomeProc @arg1='Foo', @arg2='Bar'
这并非罕见 - 多年来(在COM时代),我的很多代码都必须使用按位传递的ADODB驱动程序。
在这种情况下,您提供的名称仅提供 作为本地键,以便从集合集合中查找值。您可以通过创建名称轻松验证:
cmd.Parameters.Add(new OracleParameter("BANANA", ...
cmd.Parameters.Add(new OracleParameter("GUITAR", ...
...
cmd.Parameters["BANANA"].Value.ToString()
cmd.Parameters["GUITAR"].Value.ToString()
如果上面运行没有错误,它将通过位置。并且它们 按位置传递...然后只需按正确的顺序添加它们;-p并且永远不要添加新的参数,除了最后......
答案 2 :(得分:1)
不是问题的答案,但您可以使用'insert ... returns ... into'而不是从dual中选择bgt_sequence.currval,例如:
begin
insert into test (id)
values(test_seq.nextval)
returning id into p_id;
end;
请参阅http://www.adp-gmbh.ch/ora/sql/insert_into_x_returning_y.html