插入oracle后触发

时间:2015-05-19 10:18:47

标签: database oracle

我有2个表,我想在第一个表插入第一个表之后从第一个到第二个触发数据。

PERSON

PERSONID   NOT NULL NUMBER(10)   
USERNAME   NOT NULL VARCHAR2(50) 
PASSWORD   NOT NULL VARCHAR2(50) 
FIRSTNAME  NOT NULL VARCHAR2(50) 
LASTNAME   NOT NULL VARCHAR2(50) 
EMAIL      NOT NULL VARCHAR2(50) 
BIRTHDATE           DATE         
USERTYPE   NOT NULL VARCHAR2(20) 
BIRTHPLACE          VARCHAR2(50) 

USERNAMES

ID       NOT NULL NUMBER(10)   
USERNAME NOT NULL VARCHAR2(50) 
PASSWORD NOT NULL VARCHAR2(50) 
EMAIL    NOT NULL VARCHAR2(50)
PersonID表中的

PERSONID表中USERNAMES的FK。我想进行一些插入(PERSON表中的大数据 - 关于500000个条目)我希望所有500000都被ID表中的USERNAMEPASSWORDEMAILUSERNAMES触发。

我尝试了此触发器,但如果在INSERT表中的第二个PERSON后失败:

CREATE OR REPLACE TRIGGER insert_person
AFTER INSERT
   ON Person


    DECLARE
       v_id NUMBER(10);
       v_username varchar2(50);  
       v_password varchar2(50);
       v_email varchar2(50);
    BEGIN

       -- Find username of person 
       SELECT PersonId,Username,Password,Email INTO v_id,v_username,v_password,v_email
       FROM Person;

       -- Insert record into USERNAMES table
       INSERT INTO Usernames
       ( 
        Id,
        Username,
        Password,
        Email
       )
       VALUES
       ( v_id,
         v_username,
         v_password,
         v_email
       );

    END;

第一个插件工作正常,但是, 第二次插入PERSON表后,我收到以下错误:

Error starting at line 3 in command:
insert into person values(1,'SparhatC','qwezx2','Cosmin','Sparhat','cos.cosm@asd.com',TO_DATE('1990/07/09', 'yyyy/mm/dd'),'2','Botosani')
Error report:
SQL Error: ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SYSTEM.INSERT_PERSON", line 9
ORA-04088: error during execution of trigger 'SYSTEM.INSERT_PERSON'
01422. 00000 -  "exact fetch returns more than requested number of rows"
*Cause:    The number specified in exact fetch is less than the rows returned.
*Action:   Rewrite the query or change number of rows requested

你能告诉我一些事情吗?

2 个答案:

答案 0 :(得分:3)

在触发器主体中,您正在从PERSON表中选择所有记录。这是您的错误的原因 - 当触发器第二次触发时,PERSON包含两行,但SELECT INTO必须只返回一行。

实际上,SELECT是多余的 - 如果通过添加FOR EACH ROW子句将语句级触发器更改为行级触发器,则可以使用{{1}简单地引用新值}}:

:NEW

答案 1 :(得分:0)

选择返回多行。

因此,您的查询必须有一个唯一的列,然后它才会返回一个。

尝试使用'where',因为你将所有的表行都带走了。