我试图获得一个"自动增量" Oracle db中的列。要创建该列,我使用序列和触发器。
创作脚本:
create table SD_LOG (
ID_SD_LOG number(19) primary key,
LOG_DATE timestamp(3) default systimestamp NOT NULL,
MODULE nvarchar2(15) NOT NULL,
INSTANCE number(5) NOT NULL,
REMOTE_ADDR nvarchar2(39) NOT NULL,
USERNAME nvarchar2(30) NOT NULL,
USER_AGENT nvarchar2(1024) NOT NULL,
HTTP_METHOD nvarchar2(8) NOT NULL,
HTTP_REQ_URL nvarchar2(1024) NOT NULL,
HTTP_STATUS number(5),
ERROR nvarchar2(100),
DETAILS clob
);
/
-- Generate ID using sequence and trigger
create sequence SD_LOG_seq start with 1 increment by 1;
create or replace trigger SD_LOG_seq_tr
before insert on SD_LOG for each row
when (new.ID_SD_LOG is null)
begin
select SD_LOG_seq.nextval into :new.ID_SD_LOG from dual;
end;
/
每次进行插入操作时,我都需要获取ID_SD_LOG创建的值,以便以后进行行更新。
我跟着其他一些问题,但由于某种原因我正在尝试的声明失败了:
SQL错误:ORA-00905:缺少关键字
这是我试图运行的声明(单独插入,没有'返回...'工作得很好):
INSERT INTO SD_LOG
(MODULE, INSTANCE, REMOTE_ADDR, USERNAME, USER_AGENT, HTTP_METHOD, HTTP_REQ_URL)
VALUES
('modulename', '1', '192.168.0.1', 'User Name', 'blah blah blah blah', 'POST', '/page?query=1234567890')
RETURNING ID_SD_LOG INTO gen_id;
知道我为什么会收到这个错误?或者在不使用程序的情况下以任何其他方式执行此操作?
答案 0 :(得分:4)
RETURNING
子句是PL / SQL语言的一个特性。您不能在普通的SQL上下文中使用它,例如SQL Developer脚本,SQL * Plus或JDBC语句。当然,这非常不幸。 There's an idea on this Oracle ideas platform that can be upvoted, to fix this
但是,您可以将语句包装在匿名块中,以返回到PL / SQL上下文:
SET SERVEROUTPUT ON
DECLARE
gen_id SD_LOG.ID_SD_LOG%TYPE;
BEGIN
INSERT INTO SD_LOG
(MODULE, INSTANCE, REMOTE_ADDR, USERNAME, USER_AGENT, HTTP_METHOD, HTTP_REQ_URL)
VALUES
('modulename', '1', '192.168.0.1', 'User Name', 'blah blah blah blah', 'POST', '/page?query=1234567890')
RETURNING ID_SD_LOG INTO gen_id;
dbms_output.put_line(gen_id);
END;
/