表SELECT中的PLSQL NULL或空集合

时间:2018-09-13 10:47:14

标签: plsql collections

我正在尝试找出一种可以为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或为空,但是如果它具有条目(例如在此示例中)以将它们包括在限定中,则我想选择所有行。希望有道理!

谢谢!

2 个答案:

答案 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 nullis 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();