【发布时间】:2014-11-06 23:30:24
【问题描述】:
我正在处理一个 C# 项目,我正在尝试使用以下 SQL 对 Oracle 数据库插入一条记录:
String Qry = INSERT INTO browsers (browsers.browser,browsers.engine,browsers.platform,browsers.version,browsers.grade) VALUES ('Alans browser','Gecko','every','1.0','U') RETURNING id INTO :ID
我正在关注示例代码:http://www.sqlines.com/oracle-to-sql-server-cs-conversion/insert-returning-clause
我的代码如下:
OracleConnection conn = new OracleConnection(...);
OracleCommand cmd = null;
...
cmd = new OracleCommand(Qry, conn);
OracleParameter prm = new OracleParameter();
prm = new OracleParameter(":ID", OracleDbType.Int32, ParameterDirection.ReturnValue);
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery(); //this line throws error
query.setNewRecordID(cmd.Parameters[":ID"].Value.ToString());
...
当然,浏览器表的 id 列设置了 Sequence 和 Trigger 以在任何插入时自动递增。当我不尝试设置 id 列时,我不明白为什么会出现错误。我只是想检索赋予新记录的 id 值。
Uddate:以下是创建序列和触发器的 SQL 命令:
顺序:
CREATE SEQUENCE "SYSTEM"."BROWSERS_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER NOCYCLE NOPARTITION ;
触发器:
create or replace trigger BROWSERS_TRG
before insert on "SYSTEM"."BROWSERS"
for each row
begin
if inserting then
if :NEW."ID" is null then
select BROWSERS_SEQ.nextval into :NEW."ID" from dual;
end if;
end if;
end;
【问题讨论】:
-
您能否通过查询视图 user_triggers 来确认您的触发器的状态是否已启用?我假设触发器是一个类似的“插入前”触发器,并且它插入 browsers_seq 的 NEXTVAL?
-
我已经为上面的序列和触发器添加了代码。我很确定它们设置正确。我不确定如何查询您所说的视图。你能告诉我查询是什么样的,以便我进行测试吗?
-
我会运行这样的查询,
SELECT * FROM user_triggers WHERE table_name = 'BROWSERS' AND trigger_name = 'BROWSERS_TRG' -
好的。我运行了查询。它是成功的。状态栏表明它已启用。
-
只是想确保状态列指示它是“启用”。该错误表明这似乎不起作用。