有没有办法只运行一次查询以选择变量,考虑到查询可能什么都不返回,那么在这种情况下变量应该为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)
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)
使用光标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)
使用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)