Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plsql 如何在trigger-oraclepl/SQL中描述用户输入值_Plsql_Triggers_Oracle11g - Fatal编程技术网

Plsql 如何在trigger-oraclepl/SQL中描述用户输入值

Plsql 如何在trigger-oraclepl/SQL中描述用户输入值,plsql,triggers,oracle11g,Plsql,Triggers,Oracle11g,我正在学习PL/SQL,并尝试创建一个触发器,一旦事实表中满足了特定条件,数据将被路由到适当的维度表 有一个事实表 BHM_事实表 四维表 必和必拓员工 必和必拓账户 必和必拓订户 BHM_费用 在事实表中,有一个“S_Number”列作为事实表的主键。还有一个“代码”列,列出a、B、C或D,具体取决于记录是列出员工、帐户、订户还是费用(顺便说一下,这是一个非常基本的基本表) 事实表仅包含以下列: S_数 代码 雇员 帐目 订户 费用 维度表包含用于保存有关员工、帐户、订阅者和费用的数据

我正在学习PL/SQL,并尝试创建一个触发器,一旦事实表中满足了特定条件,数据将被路由到适当的维度表

有一个事实表
BHM_事实表

四维表

  • 必和必拓员工
  • 必和必拓账户
  • 必和必拓订户
  • BHM_费用
在事实表中,有一个“S_Number”列作为事实表的主键。还有一个“代码”列,列出a、B、C或D,具体取决于记录是列出员工、帐户、订户还是费用(顺便说一下,这是一个非常基本的基本表)

事实表仅包含以下列:

  • S_数
  • 代码
  • 雇员
  • 帐目
  • 订户
  • 费用
维度表包含用于保存有关员工、帐户、订阅者和费用的数据的附加列(您可以在下面的触发器中查看这些列的详细信息)

我想要触发器做的是根据事实表中输入的内容将用户输入的数据路由到相应的维度表中——即,一旦输入了一行代码“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、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_编号和代码。其他列在事实表中不可用,仅在维度表中可用。那么其他列的数据源是什么?不知何故,直接来自用户的输入。虽然我不确定这是否可行,但我肯定我不知道这将如何实现。如果是用户输入,那么它必须在某个表中可用,触发器才能工作。或者,完全跳过触发器,使用一个存储过程来检查代码,并在用户提交数据时填充到其他表中