我正在学习PL/SQL,并试图创建一个触发器,一旦满足了事实表中的特定条件,数据将被路由到适当的维度表中。
有一个事实表
BHM_FACT_TABLE
四维表
在事实表中,有一个"S_Number“列作为事实表的主键。还有一个"Code“列,它列出A、B、C或D,这取决于记录是列出员工、帐户、订阅者还是费用(顺便说一句,这是一个非常基本的基本表)。
事实表仅包含下列列:
维度表包含其他列,以保存有关员工、帐户、订阅服务器和费用的数据(您可以在下面的触发器中看到详细信息)。
我想要触发器做的是根据事实表中输入的内容将用户输入的数据路由到适当的维度表--即,一旦输入一行代码为'A',这意味着该记录是雇员的--这将提示其余的值输入到BHM_EMPLOYEES表中。以此类推。所以,这就是我想出来的
CREATE OR replace TRIGGER bhm_test
AFTER INSERT ON bhm_fact_table
FOR EACH ROW
DECLARE
v_code VARCHAR2 (1);
BEGIN
SELECT code
INTO v_code
FROM bhm_fact_table;
IF v_code = 'A' THEN
INSERT INTO bhm_employees
(s_number,
code,
employeename,
employeeaddress,
employeessn,
employeephonenumber,
employeesalary)
VALUES ( :NEW.s_number,
:NEW.code,
employeename,
employeeaddress,
employeessn,
employeephonenumber,
employeesalary );
ELSIF v_code = 'B' THEN
INSERT INTO bhm_accounts
(s_number,
code,
accountname,
address,
taxid,
phonenumber,
invoicetotal)
VALUES ( :NEW.s_number,
:NEW.code,
accountname,
address,
taxid,
phonenumber,
invoicetotal );
ELSIF v_code = 'C' THEN
INSERT INTO bhm_subscribers
(s_number,
code,
subscribername,
subscriberaddress,
subscriberphone,
subscribertype,
subscriberpaid)
VALUES ( :NEW.s_number,
:NEW.code,
subscribername,
subscriberaddress,
subscriberphone,
subscribertype,
subscriberpaid );
ELSIF v_code = 'D' THEN
INSERT INTO bhm_expenses
(s_number,
code,
expensesname,
expensesamt)
VALUES ( :NEW.s_number,
:NEW.code,
expensesname,
expensesamt );
END IF;
END; 为此,我将得到错误ORA-00984:列在这里不允许。
对于为值列出的最后一列(employeesalary、invoicetotal、)。我删除了您没有看到的列的绑定变量;最初我使用了所有值,但得到了“不好的绑定变量”错误。
因此,我的第一个问题是,如果我还不知道这些信息,并且它不会从事实表中存储(因此可以参考),我会在VALUES子句中添加什么?
我的第二个问题是-我甚至用这个扳机走到了正确的方向吗?
发布于 2015-01-08 05:32:43
那么,您正在尝试从插入的相同的表中获取信息,所以至少您会遇到一个Mutating table/trigger error。
您不需要选择代码,它可以通过触发器中的:NEW.CODE访问。
另一个问题是,您试图插入到各个表中,而不引用源-
INSERT INTO bhm_accounts
(s_number,
code,
accountname,
address,
taxid,
phonenumber,
invoicetotal)
VALUES ( :NEW.s_number,
:NEW.code,
accountname,
address,
taxid,
phonenumber,
invoicetotal );例如,这是没有意义的,因为您试图引用同一列作为要插入的数据源。
如果列在BHM_FACT_TABLE中可用,则可以使用:NEW.COLUMN_NAME修饰符引用它们,并将它们插入到后续表中。
但是,既然您提到这些列在BHM_FACT_TABLE中不存在,并且它们是用户输入的,那么触发器就是一种错误的方法。触发器在预先很容易地存储/可用数据时非常有用。
一个更好的方法不是使用触发器,而是使用一个存储过程,它将根据列将数据插入到各种表中。
https://stackoverflow.com/questions/27833378
复制相似问题