select 在 case 语句中不起作用

select inside a case statement not works

我想在 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>

在 PL/SQL 中,您需要进行 SELECT ... INTO。所以,re-write 你的代码:

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;

您正在尝试将 PL/SQL 控制语句 CASE 与 SQL CASE 表达式组合。 虽然可以在 SQL CASE

THEN return 表达式中使用 sub-query
select CASE WHEN 1=1 THEN ( select 1 FROM DUAL ) 
ELSE 0 END FROM DUAL;

尽管语法相同,但在 PL/SQL 中使用它时情况并非如此。

阅读 SQL、CASE1 and PL/SQL : CASE2

的 Oracle 文档

您不能在 PL/SQL 代码中直接使用标量子查询,就像您所展示的那样。 (当然,你已经知道了。)你必须 select 值 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.

分配给它