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 中使用它时情况并非如此。
的 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.
分配给它
我想在 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 中使用它时情况并非如此。
的 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.