我想在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)
如何正确创建此触发器?
提前致谢。
答案 0 :(得分:1)
您的insert
遗漏了values
个关键字;错误来自它试图将值解释为列名称。并且coinid
是一个记录,因此您需要引用其中的字段,即游标声明中的id
:
insert into balances
values (BALANCES_ID_SEQ.NEXTVAL,v_userid,coinid.id,0);
最好列出列。