我有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
表中的 PERSON
是ID
表中USERNAMES
的FK。我想进行一些插入(PERSON
表中的大数据 - 关于500000个条目)我希望所有500000都被ID
表中的USERNAME
,PASSWORD
,EMAIL
和USERNAMES
触发。
我尝试了此触发器,但如果在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
你能告诉我一些事情吗?
答案 0 :(得分:3)
在触发器主体中,您正在从PERSON表中选择所有记录。这是您的错误的原因 - 当触发器第二次触发时,PERSON包含两行,但SELECT INTO
必须只返回一行。
实际上,SELECT
是多余的 - 如果通过添加FOR EACH ROW
子句将语句级触发器更改为行级触发器,则可以使用{{1}简单地引用新值}}:
:NEW
答案 1 :(得分:0)
选择返回多行。
因此,您的查询必须有一个唯一的列,然后它才会返回一个。
尝试使用'where',因为你将所有的表行都带走了。