Sql 获取Oracle中inserte行的ID,使用序列和触发器插入ID
我正在尝试获取Oracle db中“autoincrement”列的值。要创建该列,我使用序列和触发器 创建脚本:Sql 获取Oracle中inserte行的ID,使用序列和触发器插入ID,sql,database,oracle,Sql,Database,Oracle,我正在尝试获取Oracle db中“autoincrement”列的值。要创建该列,我使用序列和触发器 创建脚本: 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
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\u SD\u LOG的创建值,以便以后进行行更新
我接着问了一些其他问题,但出于某种原因,我尝试的陈述失败了:
SQL错误:ORA-00905:缺少关键字
这是我试图运行的语句(单独插入,没有“RETURNING…”就可以了):
知道我为什么会犯这样的错误吗?或者不使用过程的任何其他方法来执行此操作?该子句是PL/SQL语言特性。您不能在普通SQL上下文中使用它,例如SQL开发人员脚本、SQL*Plus或JDBC语句。那当然很不幸
但是,您可以将语句包装在匿名块中,以返回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;
/
您如何运行此查询?从PL/SQL块中?因为(遗憾的是,
RETURNING
子句是Oracle中的PL/SQL语言功能,而不是SQL语言功能。如果我在PL/SQL块中运行查询,并将gen\u id
定义为NUMBER
,对我来说效果很好。正如@LukasEder所问的,您执行INSERT…返回的上下文是什么。。。声明?@LukasEder啊。。。我在Oracle SQL Developer中测试这些语句,我猜它使用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;
/