使用内部光标创建触发器以进行多次插入

时间:2014-01-25 20:05:38

标签: oracle plsql sqlplus

我想在USERS表的每个插入上创建一个触发器,它将向BALANCES表插入几个条目,SQL_COINS_VIEW视图中存在的每个硬币ID都有一个条目(希望我足够清楚)。这个想法是每次创建一个帐户时,它会为列表中的每个可用硬币获得一个余额0。

我试过了 -

CREATE or REPLACE TRIGGER update_balances
AFTER INSERT
ON USERS
FOR EACH ROW
DECLARE
v_userid number(8);
cursor coinlist_cur is
select ID from SQL_COINS_VIEW;
BEGIN
select ID into v_userid from USERS;
For coinid in coinlist_cur
loop
insert into balances
(BALANCES_ID_SEQ.NEXTVAL,v_userid,coinid,0);
end loop;
END;

但是我收到了错误 -

Error(10,1): PL/SQL: SQL Statement ignored
Error(11,42): PL/SQL: ORA-01747: invalid user.table.column, table.column, or column specification

表格是这样的结构 -

SQL> desc SQL_COINS_VIEW;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(10)
 NAME                                      NOT NULL VARCHAR2(50)
 VALUE                                     NOT NULL NUMBER(18,6)
 UPDATETIME                                         NVARCHAR2(10)

SQL>
SQL> desc USERS;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(8)
 LOGINNAME                                 NOT NULL VARCHAR2(12)
 PASSWORD                                  NOT NULL VARCHAR2(12)
 EMAIL                                     NOT NULL VARCHAR2(50)
 PHONENUMBER                                        VARCHAR2(25)

SQL>
SQL> desc BALANCES;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(12)
 USERID                                    NOT NULL NUMBER(8)
 COINID                                    NOT NULL NUMBER(10)
 AMOUNT                                    NOT NULL NUMBER(30)

如何正确创建此触发器?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的insert遗漏了values个关键字;错误来自它试图将值解释为列名称。并且coinid是一个记录,因此您需要引用其中的字段,即游标声明中的id

insert into balances
values (BALANCES_ID_SEQ.NEXTVAL,v_userid,coinid.id,0);

最好列出列。