1

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

3 回答 3

3

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

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

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

但是,如果练习的全部目的是练习casePL/SQL 中使用的表达式,而不是在 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。

于 2018-04-09T17:22:50.080 回答
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;
于 2018-04-09T16:53:57.007 回答
2

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

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

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

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

于 2018-04-09T17:22:33.690 回答