Sql 获取Oracle中inserte行的ID,使用序列和触发器插入ID

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

我正在尝试获取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        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;
/