【问题标题】:select inside a case statement not works在 case 语句中选择不起作用
【发布时间】:2018-09-19 03:19:33
【问题描述】:

我想在 PLSQL 的 CASE THEN 语句中编写一个 select 语句,但它会引发错误。请告知我是否可以在 THEN 语句中编写 select 语句。

类似于我的要求的示例如下所示

SET SERVEROUTPUT ON
DECLARE
LV_VAR VARCHAR2(4000):=NULL;
BEGIN
LV_VAR:= CASE 
                    WHEN 1=1 THEN 
                        (SELECT 1 FROM DUAL)
                     ELSE
                        0
                     END;
DBMS_OUTPUT.PUT_LINE(LV_VAR);
END;

执行的时候报错如下

ORA-06550: line 6, column 26:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

   ( - + case mod new not null <an identifier>
   <a double-quoted delimited-identifier> <a bind variable>

【问题讨论】:

标签: oracle plsql oracle11g oracle12c plsql-package


【解决方案1】:

您不能直接在 PL/SQL 代码中使用标量子查询,就像您展示的那样。 (当然,您已经知道了。)您必须选择值INTO 一个变量,然后使用它。

另外:您的代码中没有 case 语句。你有一个case 表达式。它只是不会像你写的那样工作。

另一种方法是在 SQL SELECT ... INTO 语句中使用 case 表达式,正如 David Goldman 在其回答中所展示的那样。

但是,如果您练习的全部目的是练习 PL/SQL 中使用的 case 表达式,而不是在 SQL 语句中,则需要 SELECT ... INTO 在代码中声明一个变量,然后使用case 表达式中的那个变量。像这样的:

DECLARE
  LV_VAR VARCHAR2(4000);
BEGIN
  SELECT 1 INTO LV_VAR FROM DUAL;
  LV_VAR:= CASE 
                WHEN 1=1 THEN 
                  LV_VAR
                ELSE
                  0
           END;
  DBMS_OUTPUT.PUT_LINE(LV_VAR);

END;

如您所见,我做了一些在过程语言代码中经常做的事情:我没有声明和使用两个变量,而是只声明了一个。我用SELECT ... INTO 查询的结果填充了它。然后我在 case 表达式中再次分配给它:在一种情况下,我将其分配给它自己,在另一种情况下,我将值分配给它 0。

【讨论】:

    【解决方案2】:

    在 PL/SQL 中,您需要执行 SELECT ... INTO。所以,重写你的代码:

    SET SERVEROUTPUT ON
    DECLARE
    LV_VAR VARCHAR2(4000):=NULL;
    BEGIN
    
    SELECT CASE 
               WHEN 1=1 then 1
                        else 0
           end
    INTO LV_VAR
    FROM DUAL;
    DBMS_OUTPUT.PUT_LINE(LV_VAR);
    END;
    

    【讨论】:

      【解决方案3】:

      您正在尝试将 PL/SQL 控制语句 CASE 与 SQL CASE 表达式结合使用。 虽然可以在 SQL CASE 的 THEN 返回表达式中使用子查询,

      select CASE WHEN 1=1 THEN ( select 1 FROM DUAL ) 
      ELSE 0 END FROM DUAL;
      

      虽然语法相同,但在 PL/SQL 中使用时并非如此。

      阅读有关 SQL、CASE1 和 PL/SQL 的 Oracle 文档:CASE2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 2015-05-14
        相关资源
        最近更新 更多