首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在触发器- Oracle PL/SQL中描述用户输入值

如何在触发器- Oracle PL/SQL中描述用户输入值
EN

Stack Overflow用户
提问于 2015-01-08 05:13:52
回答 1查看 1.4K关注 0票数 0

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

有一个事实表

BHM_FACT_TABLE

四维表

  • BHM_EMPLOYEES
  • BHM_ACCOUNTS
  • BHM_SUBSCRIBERS
  • BHM_EXPENSES

在事实表中,有一个"S_Number“列作为事实表的主键。还有一个"Code“列,它列出A、B、C或D,这取决于记录是列出员工、帐户、订阅者还是费用(顺便说一句,这是一个非常基本的基本表)。

事实表仅包含下列列:

  • S_Number
  • 代码
  • 员工
  • 账号
  • 订阅者
  • 开支。

维度表包含其他列,以保存有关员工、帐户、订阅服务器和费用的数据(您可以在下面的触发器中看到详细信息)。

我想要触发器做的是根据事实表中输入的内容将用户输入的数据路由到适当的维度表--即,一旦输入一行代码为'A',这意味着该记录是雇员的--这将提示其余的值输入到BHM_EMPLOYEES表中。以此类推。所以,这就是我想出来的

代码语言:javascript
复制
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子句中添加什么?

我的第二个问题是-我甚至用这个扳机走到了正确的方向吗?

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 05:32:43

那么,您正在尝试从插入的相同的表中获取信息,所以至少您会遇到一个Mutating table/trigger error

您不需要选择代码,它可以通过触发器中的:NEW.CODE访问。

另一个问题是,您试图插入到各个表中,而不引用源-

代码语言:javascript
复制
 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中不存在,并且它们是用户输入的,那么触发器就是一种错误的方法。触发器在预先很容易地存储/可用数据时非常有用。

一个更好的方法不是使用触发器,而是使用一个存储过程,它将根据列将数据插入到各种表中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27833378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档