我正在尝试找出一种可以为null或为空的表类型的资格的干净方法。以下是我到目前为止尝试过的方法,但是导致
ORA-01427:单行子查询返回多个行
DECLARE
V_TEMP_IDS V500.T_TEMP_IDS := V500.T_TEMP_IDS(123, 124);
TYPE T_RESULTS IS TABLE OF NUMBER;
V_RESULTS T_RESULTS;
BEGIN
SELECT TEMP_ID BULK COLLECT INTO V_RESULTS FROM PEOPLE
WHERE ACTIVE = 1
AND TEMP_ID IN (COALESCE(NULLIF((SELECT * FROM TABLE(V_TEMP_IDS)), 0), TEMP_ID));
dbms_output.put_line(SQL%ROWCOUNT);
END;
如果集合为null或为空,但是如果它具有条目(例如在此示例中)以将它们包括在限定中,则我想选择所有行。希望有道理!
谢谢!
答案 0 :(得分:0)
NULLIF((SELECT * FROM TABLE(V_TEMP_IDS)), 0) -- is not allowed.
如果SELECT * FROM TABLE(V_TEMP_IDS)
返回多行,则nullif
将不起作用。
(SELECT NULLIF(*, 0) FROM TABLE(V_TEMP_IDS)) -- should be what you want to do..
答案 1 :(得分:0)
如果要检查v_temp_ids
是否为空或空,请使用is null
和is empty
运算符:
declare
v_temp_ids t_temp_ids := t_temp_ids(123, 124);
type t_results is table of number;
v_results t_results;
begin
select temp_id bulk collect into v_results from people
where active = 1
and ( temp_id member of v_temp_ids
or v_temp_ids is empty
or v_temp_ids is null );
dbms_output.put_line(sql%rowcount);
end;
使用以下测试空集合
v_temp_ids t_temp_ids;
使用
测试一个空集合v_temp_ids t_temp_ids := t_temp_ids();