如果值在 table.column 和 table.column 之间,则
if value between table.column and table.column then
我是 SQL 的超级新人,我正在尝试做一个练习 IRPF_TABLE:
IRPF LOWER_VALUE UPPER_VALUE PERCENTAJE
1 0 12449 ,19
2 12450 20199 ,24
3 20200 35199 ,3
4 35200 59999 ,37
5 60000 99999 ,45
我想做这样的事情:
DECLARE
salary_month NUMBER(10,2) := 1000;
salary_anual NUMBER (10,2);
irpf_perc NUMBER (10, 2);
irpf_to_pay NUMBER (10, 2);
BEGIN
salary_anual := salary_month * 12;
DBMS_OUTPUT.PUT_LINE(salary_month);
IF salary_anual BETWEEN irpf_table.lower_value AND irpf_table.upper_value THEN
SELECT percentaje INTO irpf_perc FROM IRPF_TABLE;
END IF;
irpf_to_pay := salary_anual * irpf_perc / 100;
DBMS_OUTPUT.PUT_LINE(salary_anual);
DBMS_OUTPUT.PUT_LINE(irpf_perc);
DBMS_OUTPUT.PUT_LINE(irpf_to_pay);
END;
输出:
错误信息 -
ORA-06550: 第 10 行,第 39 列:
PLS-00357: La referencia a la tabla, vista o secuencia 'IRPF_TABLE.LOWER_VALUE' no está permitida en este contexto
ORA-06550: 第 10 行,第 5 列:
PL/SQL: 语句被忽略
06550.00000 - “行 %s,列 %s:\n%s”
*原因:通常是 PL/SQL 编译错误。
*动作:
它表示在此上下文中不允许引用 table、'IRPF_TABLE.LOWER_VALUE'。我不知道我做错了什么。正如我所说,我是 SQL 的新手。我知道我的 IF 条件有问题,但我迷路了。
谢谢你进阶
您在 IF 中引用了 table,但是 - 它在此上下文中是 未知,因此您遇到了错误。也许你的意思是
SELECT percentaje
INTO irpf_perc
FROM IRPF_TABLE
WHERE salary_anual BETWEEN lower_value AND upper_value;
但是 - 使用它,如果不止一个人的年薪介于下限值和上限值之间,您很可能会收到错误消息 (too_many_rows
)。或者,no_data_found
如果没有人拥有它。
根据您想对该段代码执行的操作,您可以通过使用异常处理部分来处理它,或者在循环中执行,或者将数据提取到集合中,或者其他任何方式。
当您 post 编辑了一段不起作用的代码,但错过了 post 示例数据、所需的输出(基于数据)和最后(但并非最不重要)解释你想做什么(使用简单的英语),除了尝试猜测之外,我们帮不上什么忙。
而不是下面的 if else
IF salary_anual BETWEEN irpf_table.lower_value AND irpf_table.upper_value THEN
SELECT percentaje INTO irpf_perc FROM IRPF_TABLE;
END IF;
您需要像这样在 where 子句中使用条件:
SELECT percentaje INTO irpf_perc FROM IRPF_TABLE
where salary_anual BETWEEN lower_value AND upper_value;
工作查询:
DECLARE
salary_month NUMBER(10,2) := 1000;
salary_anual NUMBER (10,2);
irpf_perc NUMBER (10, 2);
irpf_to_pay NUMBER (10, 2);
BEGIN
salary_anual := salary_month * 12;
DBMS_OUTPUT.PUT_LINE(salary_month);
SELECT percentaje INTO irpf_perc FROM IRPF_TABLE
where salary_anual BETWEEN lower_value AND upper_value;
irpf_to_pay := salary_anual * irpf_perc / 100;
DBMS_OUTPUT.PUT_LINE(salary_anual);
DBMS_OUTPUT.PUT_LINE(irpf_perc);
DBMS_OUTPUT.PUT_LINE(irpf_to_pay);
END;
输出:
Statement processed.
1000
12000
19
2280
我是 SQL 的超级新人,我正在尝试做一个练习 IRPF_TABLE:
IRPF LOWER_VALUE UPPER_VALUE PERCENTAJE
1 0 12449 ,19
2 12450 20199 ,24
3 20200 35199 ,3
4 35200 59999 ,37
5 60000 99999 ,45
我想做这样的事情:
DECLARE
salary_month NUMBER(10,2) := 1000;
salary_anual NUMBER (10,2);
irpf_perc NUMBER (10, 2);
irpf_to_pay NUMBER (10, 2);
BEGIN
salary_anual := salary_month * 12;
DBMS_OUTPUT.PUT_LINE(salary_month);
IF salary_anual BETWEEN irpf_table.lower_value AND irpf_table.upper_value THEN
SELECT percentaje INTO irpf_perc FROM IRPF_TABLE;
END IF;
irpf_to_pay := salary_anual * irpf_perc / 100;
DBMS_OUTPUT.PUT_LINE(salary_anual);
DBMS_OUTPUT.PUT_LINE(irpf_perc);
DBMS_OUTPUT.PUT_LINE(irpf_to_pay);
END;
输出:
错误信息 - ORA-06550: 第 10 行,第 39 列: PLS-00357: La referencia a la tabla, vista o secuencia 'IRPF_TABLE.LOWER_VALUE' no está permitida en este contexto ORA-06550: 第 10 行,第 5 列: PL/SQL: 语句被忽略 06550.00000 - “行 %s,列 %s:\n%s” *原因:通常是 PL/SQL 编译错误。 *动作:
它表示在此上下文中不允许引用 table、'IRPF_TABLE.LOWER_VALUE'。我不知道我做错了什么。正如我所说,我是 SQL 的新手。我知道我的 IF 条件有问题,但我迷路了。 谢谢你进阶
您在 IF 中引用了 table,但是 - 它在此上下文中是 未知,因此您遇到了错误。也许你的意思是
SELECT percentaje
INTO irpf_perc
FROM IRPF_TABLE
WHERE salary_anual BETWEEN lower_value AND upper_value;
但是 - 使用它,如果不止一个人的年薪介于下限值和上限值之间,您很可能会收到错误消息 (too_many_rows
)。或者,no_data_found
如果没有人拥有它。
根据您想对该段代码执行的操作,您可以通过使用异常处理部分来处理它,或者在循环中执行,或者将数据提取到集合中,或者其他任何方式。
当您 post 编辑了一段不起作用的代码,但错过了 post 示例数据、所需的输出(基于数据)和最后(但并非最不重要)解释你想做什么(使用简单的英语),除了尝试猜测之外,我们帮不上什么忙。
而不是下面的 if else
IF salary_anual BETWEEN irpf_table.lower_value AND irpf_table.upper_value THEN
SELECT percentaje INTO irpf_perc FROM IRPF_TABLE;
END IF;
您需要像这样在 where 子句中使用条件:
SELECT percentaje INTO irpf_perc FROM IRPF_TABLE
where salary_anual BETWEEN lower_value AND upper_value;
工作查询:
DECLARE
salary_month NUMBER(10,2) := 1000;
salary_anual NUMBER (10,2);
irpf_perc NUMBER (10, 2);
irpf_to_pay NUMBER (10, 2);
BEGIN
salary_anual := salary_month * 12;
DBMS_OUTPUT.PUT_LINE(salary_month);
SELECT percentaje INTO irpf_perc FROM IRPF_TABLE
where salary_anual BETWEEN lower_value AND upper_value;
irpf_to_pay := salary_anual * irpf_perc / 100;
DBMS_OUTPUT.PUT_LINE(salary_anual);
DBMS_OUTPUT.PUT_LINE(irpf_perc);
DBMS_OUTPUT.PUT_LINE(irpf_to_pay);
END;
输出:
Statement processed.
1000
12000
19
2280