我的oracle触发器出了点问题

时间:2016-03-10 10:54:00

标签: oracle select triggers

我的Oracle Trigger语法之一需要帮助

CREATE OR REPLACE TRIGGER "TRG_TRIGGER" AFTER INSERT
ON T_TABLE
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
INSERT INTO T_TABLE_TEST
  (DOC_ID , DOC_NAME)
VALUES
(:NEW.DOC_ID, SELECT DOC_NAME FROM OTHER_TABLE WHERE DOC_ID=DOC_ID); 

需要其他桌面的DOC_NAME。我想只需要修改我的选择查询吗?

3 个答案:

答案 0 :(得分:3)

正如其他人所建议的那样,你可以将insert ... values语句重写为insert ...作为select语句,这将是最有意义的。

只是fyi,你的原始插入语句有两个问题突然出现在我身上:

  1. 您在select语句中指定了doc_id = doc_id,而我认为您的意思是doc_id = :new.doc_id。如果您的查询能够运行,您的查询将返回另一个表中的所有行,并且您将获得ORA-01427: single-row subquery returns more than one row

  2. 您没有将select语句括在括号内。它应该是:

  3. -

    INSERT INTO T_TABLE_TEST
     (DOC_ID , DOC_NAME)
    VALUES 
     (:NEW.DOC_ID, (SELECT DOC_NAME FROM OTHER_TABLE WHERE DOC_ID=:NEW.DOC_ID)); 
    

答案 1 :(得分:2)

您需要指定要选择的doc_name,因此我认为您缺少where子句..试试这个:

INSERT INTO T_TABLE_TEST
(DOC_ID , DOC_NAME)
SELECT t.doc_id, t.DOC_NAME FROM OTHER_TABLE t where t.doc_id = :NEW.DOC_ID; 

当然我猜测其他表的列名为doc_id,将其更改为关系列。

答案 2 :(得分:2)

插入必须如下:

REFERENCING NEW AS NEW OLD AS OLD

只需注意,您可以跳过OLD,因为NEW和{{1}}是默认设置。