在案例陈述中选择不起作用



我想在 PLSQL 的 CASE THEN 语句中编写一个选择语句,但它抛出了错误。请告知我是否可以在 THEN 语句中编写选择语句。

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

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代码中使用标量子查询,就像你已经展示的那样。(当然,你已经知道了。必须INTO变量中选择值,然后使用它。

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

一种替代方法是在 SQLSELECT ... 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。

在 PL/SQL 中,您需要执行 SELECT ...到。 因此,要重写代码:

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与 SQLCASE表达式结合使用。 虽然可以在 SQLCASE的返回表达式中使用子查询THEN

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

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

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

最新更新