Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 插入oracle后触发_Database_Oracle - Fatal编程技术网

Database 插入oracle后触发

Database 插入oracle后触发,database,oracle,Database,Oracle,我有两个表,我想在第一个表中插入一些数据后,从第一个表到第二个表触发数据 人 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) BIRTHDA

我有两个表,我想在第一个表中插入一些数据后,从第一个表到第二个表触发数据

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) 
用户名

ID       NOT NULL NUMBER(10)   
USERNAME NOT NULL VARCHAR2(50) 
PASSWORD NOT NULL VARCHAR2(50) 
EMAIL    NOT NULL VARCHAR2(50)
PERSON
表中的
PersonID
USERNAMES
表中的
ID
的FK。我想做一些插入(在
PERSON
表中的大数据-大约500000个条目),我希望所有500000个条目都被触发到
ID
USERNAME
用户名
表中的
密码
电子邮件

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

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;
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
第一次插入有效,但是, 在第二次插入
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;
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

请您提供一些建议好吗?

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

事实上,
SELECT
是多余的-如果您通过为每行添加
子句将语句级触发器更改为行级触发器,您只需使用
:new
引用新值即可:

CREATE OR REPLACE TRIGGER insert_person
AFTER INSERT
   ON Person
FOR EACH ROW    
    BEGIN
       -- Insert record into audit table
       INSERT INTO Usernames
       ( 
        Id,
        Username,
        Password,
        Email
       )
       VALUES
       ( :NEW.PersonID,
         :NEW.Username,
         :NEW.Password,
         :NEW.Email
       );

    END;

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

事实上,
SELECT
是多余的-如果您通过为每行添加
子句将语句级触发器更改为行级触发器,您只需使用
:new
引用新值即可:

CREATE OR REPLACE TRIGGER insert_person
AFTER INSERT
   ON Person
FOR EACH ROW    
    BEGIN
       -- Insert record into audit table
       INSERT INTO Usernames
       ( 
        Id,
        Username,
        Password,
        Email
       )
       VALUES
       ( :NEW.PersonID,
         :NEW.Username,
         :NEW.Password,
         :NEW.Email
       );

    END;

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

事实上,
SELECT
是多余的-如果您通过为每行添加
子句将语句级触发器更改为行级触发器,您只需使用
:new
引用新值即可:

CREATE OR REPLACE TRIGGER insert_person
AFTER INSERT
   ON Person
FOR EACH ROW    
    BEGIN
       -- Insert record into audit table
       INSERT INTO Usernames
       ( 
        Id,
        Username,
        Password,
        Email
       )
       VALUES
       ( :NEW.PersonID,
         :NEW.Username,
         :NEW.Password,
         :NEW.Email
       );

    END;

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

事实上,
SELECT
是多余的-如果您通过为每行添加
子句将语句级触发器更改为行级触发器,您只需使用
:new
引用新值即可:

CREATE OR REPLACE TRIGGER insert_person
AFTER INSERT
   ON Person
FOR EACH ROW    
    BEGIN
       -- Insert record into audit table
       INSERT INTO Usernames
       ( 
        Id,
        Username,
        Password,
        Email
       )
       VALUES
       ( :NEW.PersonID,
         :NEW.Username,
         :NEW.Password,
         :NEW.Email
       );

    END;

选择返回多行

因此,查询中必须有一个唯一的列,然后它将只返回一个


请尝试使用“where”,因为您可以使用它获取所有表行。

选择返回多行

因此,查询中必须有一个唯一的列,然后它将只返回一个


请尝试使用“where”,因为您可以使用它获取所有表行。

选择返回多行

因此,查询中必须有一个唯一的列,然后它将只返回一个


请尝试使用“where”,因为您可以使用它获取所有表行。

选择返回多行

因此,查询中必须有一个唯一的列,然后它将只返回一个


试着用“where”,因为你把所有的表格行都带上了。

很酷。我现在明白了。回答得很快。很有效。不客气。如果我的答案解决了你的问题,请考虑点击复选框来接受它。酷。我现在明白了。很快的回答。它很管用。欢迎你。如果我的答案解决了你的问题,请考虑点击复选框来接受它。酷。我现在明白了。很快的回答。它很管用。欢迎你。如果我的答案解决了你的问题,请考虑点击复选框来接受它。酷。我现在明白了。很快的回答。它很管用。欢迎你。如果我的答案解决了你的问题,请考虑点击复选框来接受它。