PLSQL NULL или пустая коллекция в таблице SELECT - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь найти правильный способ определения типа таблицы, который может быть нулевым или пустым.Ниже приведено то, что я пробовал до сих пор, но в результате получается

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;

Я бы хотелвыбрать все строки, если коллекция пуста или пуста, но если в ней есть записи, как в этом примере, чтобы включить их в квалификацию.Надеюсь, что это имеет смысл!

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Если вы хотите проверить, является ли 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();
0 голосов
/ 13 сентября 2018
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..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...