获取Oracle中inserte行的ID,使用sequence和trigger插入id

时间:2018-05-15 12:50:10

标签: sql database oracle

我试图获得一个"自动增量" 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;

知道我为什么会收到这个错误?或者在不使用程序的情况下以任何其他方式执行此操作?

1 个答案:

答案 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;
/