【问题标题】:if value between table.column and table.column then如果值在 table.column 和 table.column 之间,则
【发布时间】:2021-03-28 13:35:18
【问题描述】:

我是 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 编译错误。 *行动:

它表示在此上下文中不允许对表的引用“IRPF_TABLE.LOWER_VALUE”。我不知道我做错了什么。正如我所说,我对 SQL 完全陌生。我知道我的 IF 条件有问题,但我对此一无所知。 谢谢你的高级

【问题讨论】:

    标签: sql oracle plsql oracle-sqldeveloper


    【解决方案1】:

    而不是像下面这样的 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
    

    【讨论】:

    • 谢谢!它完美地工作。当我在练习匿名块时,我只想用循环或 ifs 来解决它。
    • 不客气。如果这个答案对您有帮助,请接受。最良好的祝愿。
    • @Weenhallo:只是一个提示。无论您是使用匿名块、过程、函数、包,还是其他 rdbms,总是 都在寻找 SQL 解决方案。是的,有时可能需要标准程序(循环、if、get、...)构造。使用 rdbms 直接 SQL 几乎总是最佳选择,并且应该是您的首要目标。起初这将是困难的,因为您需要开发一种不同的方式来思考问题。但随着时间的推移,它会变得很自然,您的数据库操作也会如此。
    • 很好的建议@Belayer。在 RDBS 中,首先考虑 SQL 总是有很大帮助。谢谢。
    【解决方案2】:

    您在 IF 中引用该表,但是 - 在此上下文中它是 unknown,因此您遇到了错误。也许你的意思是

    SELECT percentaje 
      INTO irpf_perc 
      FROM IRPF_TABLE
      WHERE salary_anual BETWEEN lower_value AND upper_value;
    

    但是 - 使用它,如果超过一个人的年薪介于上下值之间,您很可能会收到错误 (too_many_rows)。或者,no_data_found 如果没有人拥有它。

    根据您想对那段代码做什么,您可以通过使用异常处理部分来处理它,或者在循环中执行它,或者将数据提取到集合中,或者其他任何方式。

    当您发布一段不起作用但错过发布示例数据的代码时,所需的输出(基于数据)和最后(但并非最不重要的)解释您想要做什么(使用简单的英语),除了尝试猜测之外,我们无能为力。

    【讨论】:

    • 非常感谢!我一直在思考如果是唯一的选择。我只是在练习关于匿名块的练习。所以要知道我没有这些问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多