Plsql 如何在trigger-oraclepl/SQL中描述用户输入值
我正在学习PL/SQL,并尝试创建一个触发器,一旦事实表中满足了特定条件,数据将被路由到适当的维度表 有一个事实表Plsql 如何在trigger-oraclepl/SQL中描述用户输入值,plsql,triggers,oracle11g,Plsql,Triggers,Oracle11g,我正在学习PL/SQL,并尝试创建一个触发器,一旦事实表中满足了特定条件,数据将被路由到适当的维度表 有一个事实表 BHM_事实表 四维表 必和必拓员工 必和必拓账户 必和必拓订户 BHM_费用 在事实表中,有一个“S_Number”列作为事实表的主键。还有一个“代码”列,列出a、B、C或D,具体取决于记录是列出员工、帐户、订户还是费用(顺便说一下,这是一个非常基本的基本表) 事实表仅包含以下列: S_数 代码 雇员 帐目 订户 费用 维度表包含用于保存有关员工、帐户、订阅者和费用的数据
BHM_事实表 四维表
- 必和必拓员工
- 必和必拓账户
- 必和必拓订户
- BHM_费用
- S_数
- 代码
- 雇员
- 帐目
- 订户
- 费用李>
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、subscriberpaid和expensesamt)列出的最后一列。我删除了列的绑定变量,您可以看到这些列没有绑定变量;我最初用所有的值来表示它们,但得到了“坏绑定变量”错误
因此,我的第一个问题是,如果我还不知道这些信息,并且这些信息不会从事实表中存储(因此可供参考),我会在VALUES子句中添加什么
我的第二个问题是——我是否用这个触发器远程地朝着正确的方向前进?好吧,您正在尝试从插入的同一个表中获取数据,所以至少您会遇到一个错误 您不需要选择代码,可以通过触发器中的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_事实_表中可用,则可以使用:NEW.COLUMN_NAME修饰符引用它们,并将它们插入后续表中
但由于您提到这些列不在BHM_事实_表中,并且它们是用户输入的,那么触发器是一种错误的方法。当您事先已存储/可用数据时,触发器非常有用
与使用触发器不同,更好的方法是使用存储过程,该过程将根据列将数据插入到各个表中 事实表中唯一的列是S_编号和代码。其他列在事实表中不可用,仅在维度表中可用。那么其他列的数据源是什么?不知何故,直接来自用户的输入。虽然我不确定这是否可行,但我肯定我不知道这将如何实现。如果是用户输入,那么它必须在某个表中可用,触发器才能工作。或者,完全跳过触发器,使用一个存储过程来检查代码,并在用户提交数据时填充到其他表中