如果值在 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