当结果可能为null时,如何在PL/SQL中选择变量?

Sap*_*nce 65 select plsql

有没有办法只运行一次查询以选择变量,考虑到查询可能什么都不返回,那么在这种情况下变量应该为null.

目前,我无法select into直接执行变量,因为如果查询什么都不返回,PL/SQL会抱怨变量没有设置.我只能运行查询两次,第一个执行计数,如果计数为零,则将变量设置为null,如果计数为1,则选择变量.

所以代码就像:

v_column my_table.column%TYPE;
v_counter number;
select count(column) into v_counter from my_table where ...;
if (v_counter = 0) then
    v_column := null;
elsif (v_counter = 1) then
    select column into v_column from my_table where ...;
end if;
Run Code Online (Sandbox Code Playgroud)

谢谢.

更新:我没有使用异常的原因是我在分配之后仍然有一些跟随逻辑v_column,我必须goto在异常部分中使用跳转回以下代码.我有点犹豫不决goto.

Ada*_*ter 111

您可以NO_DATA_FOUND通过将变量设置为来简单地处理异常NULL.这样,只需要一个查询.

    v_column my_table.column%TYPE;

BEGIN

    BEGIN
      select column into v_column from my_table where ...;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        v_column := NULL;
    END;

    ... use v_column here
END;
Run Code Online (Sandbox Code Playgroud)

  • @Sapience,这不是问题,只是把这个**嵌套**块的END后面的逻辑. (6认同)

jpe*_*jpe 14

我知道这是一个老线程,但我仍然认为值得回答它.

select (
        SELECT COLUMN FROM MY_TABLE WHERE ....
        ) into v_column
from dual;
Run Code Online (Sandbox Code Playgroud)

使用示例:

declare v_column VARCHAR2(100);
begin
  select (SELECT TABLE_NAME FROM ALL_TABLES WHERE TABLE_NAME = 'DOES NOT EXIST')
  into v_column 
  from dual;
  DBMS_OUTPUT.PUT_LINE('v_column=' || v_column);
end;
Run Code Online (Sandbox Code Playgroud)


jmc*_*jmc 7

使用光标FOR LOOP语句是我最喜欢的方法.

它比使用显式游标更安全,因为您不需要记住关闭它,因此您不能"泄漏"游标.

你不需要"into"变量,你不需要"FETCH",你不需要捕获和处理"NO DATA FOUND"异常.

试试吧,你永远不会回去.

v_column my_table.column%TYPE;

v_column := null;

FOR rMyTable IN (SELECT COLUMN FROM MY_TABLE WHERE ....) LOOP
  v_column := rMyTable.COLUMN;
  EXIT;  -- Exit the loop if you only want the first result.
END LOOP;
Run Code Online (Sandbox Code Playgroud)


Bjö*_*örn 7

使用MAX怎么办?这样,如果未找到数据,则将变量设置为NULL,否则为最大值。
由于您希望使用0或1值,因此可以使用MAX。

v_column my_table.column%TYPE;
select MAX(column) into v_column from my_table where ...;
Run Code Online (Sandbox Code Playgroud)


小智 5

从以上所有答案中,比约恩的答案似乎是最优雅,最简短的。我个人多次使用这种方法。MAX或MIN函数将同样出色地完成工作。随后是完整的PL / SQL,仅应指定where子句。

declare v_column my_table.column%TYPE;
begin
    select MIN(column) into v_column from my_table where ...;
    DBMS_OUTPUT.PUT_LINE('v_column=' || v_column);
end;
Run Code Online (Sandbox Code Playgroud)