oracle - 范围的验证触发器 - Oracle
问题描述
每当创建或更新新记录时,都需要验证此人的薪水是否在工作范围内。
具有 job_id、job_title、min_salary、max_salary 字段的Job表。包含employee_id、name、job_id 和salary的Employee表。
这是我想要做的触发器:
CREATE OR REPLACE TRIGGER range_valid
BEFORE INSERT OR UPDATE
OF JOB_ID, SALARY ON EMPLOYEES
FOR EACH ROW
DECLARE
l_min_salary INTEGER;
l_max_salary INTEGER;
l_salary INTEGER;
BEGIN
SELECT MIN_SALARY, MAX_SALARY
INTO l_min_salary, l_max_salary
FROM JOBS
WHERE JOB_ID = :new.JOB_ID;
IF l_salary < l_min_salary OR l_salary > l_max_salary THEN
RAISE_APPLICATION_ERROR (
'Salario debe estar en el rango de' || l_min_salary || ' and ' || l_max_salary);
END IF;
END range_valid;
但它向我显示了错误:
错误(9,5):PL/SQL:语句被忽略
错误(9,5):PLS-00201:必须声明标识符“L_SALARY”
我不知道如何解决它。
解决方案
您不需要声明l_salary
和使用它而不分配值也没有意义;-)。
假设employees
表包含一列salary
,触发器应如下所示:
CREATE OR REPLACE TRIGGER range_valid
BEFORE INSERT OR UPDATE OF job_id, salary
ON employees
FOR EACH ROW
DECLARE
l_min_salary INTEGER;
l_max_salary INTEGER;
BEGIN
SELECT min_salary, max_salary
INTO l_min_salary, l_max_salary
FROM jobs
WHERE job_id = :new.job_id;
IF :new.salary < l_min_salary
OR :new.salary > l_max_salary
THEN
raise_application_error('Salario debe estar en el rango de' || l_min_salary || ' and ' || l_max_salary);
END IF;
END range_valid;
/
推荐阅读
- c++ - Qt/C++ 连接经典蓝牙设备
- python - 在没有条件语句的情况下在 python 中实现重载函数的最佳方法是什么?
- python-3.x - ValueError:检查输入时出错:预期 lstm_10_input 的形状为 (679, 1) 但得到的数组的形状为 (1, 1)
- c++ - 如何确定 QTextCodec 是否与 ASCII 兼容?
- python - 加快从 pandas 数据帧到 mysql 的数据插入
- javascript - jQuery(document).on("click") & document.getElementById('sign-out').addEventListener('click') 的区别
- javascript - 如何根据颜色选择器值 onclick 的值更改元素颜色
- javascript - 如何删除不必要的括号?
- python - 在 cmd 和 IDE 上运行代码的函数内定义相对路径文件夹
- laravel - CORS 策略已阻止从源“http://localhost:8100”访问“http://127.0.0.1:8000/api/studentpost”处的 XMLHttpRequest: