我正在研究一个需要INSERT INTO和WHERE逻辑的触发器。
我有三张桌子。
Absence_table:
-----------------------------
| user_id | absence_reason |
-----------------------------
| 1234567 | 40 |
| 1234567 | 50 |
| 1213 | 40 |
| 1314 | 20 |
| 1111 | 20 |
-----------------------------
company_table:
-----------------------------
| user_id | company_id |
-----------------------------
| 1234567 | 10201 |
| 1213 | 10200 |
| 1314 | 10202 |
| 1111 | 10200 |
-----------------------------
employment_table:
--------------------------------------
| user_id | emp_type | emp_no |
--------------------------------------
| 1234567 | Int | 1 |
| 1213 | Int | 2 |
| 1314 | Int | 3 |
| 1111 | Ext | 4 |
--------------------------------------
最后我得出的数据表只有谁在jobs_table中有emp_type = Int并且有company_id = 10200
出:
--------------------------------
| employee_id | absence_reason |
--------------------------------
| 1 | 40 |
| 1 | 50 |
| 2 | 40 |
| 3 | 20 |
--------------------------------
这是我的触发器:
CREATE OR REPLACE TRIGGER "INOUT"."ABSENCE_TRIGGER"
AFTER INSERT ON absence_table
FOR EACH ROW
DECLARE
BEGIN
CASE
WHEN INSERTING THEN
INSERT INTO out (absence_reason, employee_id)
VALUES (:NEW.absence_reason, (SELECT employee_id FROM employment_table WHERE user_id = :NEW.user_id)
WHERE user_id IN
(SELECT user_id FROM employment_table WHERE employment_type = 'INT')
AND user_id IN
(SELECT user_id FROM company_table WHERE company_id = '10200');
END CASE;
END absence_trigger;
它显然无法正常工作,我无法弄清楚应该怎样做才能使其发挥作用。有什么建议吗?
答案 0 :(得分:4)
将插入更改为:
insert into out (absence_reason, employee_id)
select :NEW.absence_reason, e.emp_no
from employment_table e
inner join company_table c
on c.user_id = e.user_id
where e.user_id = :NEW.user_id
and e.emp_type = 'INT'
and c.company_id = '10200';
哪个应该有效。请注意,您的示例结构中还有emp_no
,但触发器插入中也有employee_id
。我假设emp_no
是对的。还emp_type
vs employment_type
。
最后在你的触发器中,引号中有company_id
。它真的是varchar2吗?如果可以,如果没有,请不要使用引号。
答案 1 :(得分:1)
括号不平衡。值的值不会关闭。这是您的特定错误的原因,但@ DazzaL的答案看起来像是正确的解决方案。