2017-01-18 2 views
0

Мне нужно использовать переменную PLSQL для хранения более трех значений. Мне не нужна коллекция или курсор. Ниже приведено требование, v_cnt нуждается в 9 вместо «0». PLease поможет в этом.Необходимо использовать переменную PLSQL, если select возвращает более одной записи. Нет необходимости в сборке/курсорах.

declare 
v_column VARCHAR2(200); 
v_cnt number :=0; 
begin 
    select (SELECT listagg(TABLE_NAME,',')within group(order by table_name) FROM ALL_TABLES where owner in 'SYS' AND rownum<10) 
    into v_column 
    from dual; 

    select count(*) into v_cnt from all_tables where table_name in(v_column); 
    DBMS_OUTPUT.PUT_LINE('v_column=' || v_column||' VC-nt : = '||v_cnt); 
end; 

v_column будет иметь значения, разделенные запятой. Мне нужно передать его в оператор, но v_column целые значения рассматриваются как одно значение. Есть ли способ передать его в виде отдельных 9 значений внутри оператора IN.

+0

Является ли этот пример процедурой, представляющей вашу фактическую проблему? Поскольку, как бы то ни было, я бы предложил вам просто объединить два запроса следующим образом: 'select count (*) from all_tables, где table_name in (select table_name from all_tables where ...);'. В противном случае существует множество примеров проблем «различного типа списка» как здесь, так и в «Переполнение стека» и через Google, которые вы можете искать самостоятельно. Тем не менее, я бы отказался от использования строки inlist, если бы были доступны другие, менее доступные sql-решения с разрезами. – Boneist

+0

На самом деле, в моем исходном случае мне нужно использовать эту переменную во многих операторах, чтобы избежать повторяющихся дочерних запросов. –

+0

Ii'm не следует за вами ... переменная, которая хранит несколько значений, называется коллекцией, поэтому как вы хотите, чтобы переменная хранила несколько значений, но вам не нужна коллекция? –

ответ

0

Учитывая вы собираетесь использовать значение, возвращаемое первым запросом в нескольких операторах SQL (и при условии, что они не могут быть объединены каким-то образом) Я хотел бы создать global temporary table (GTT), например:

CREATE GLOBAL TEMPORARY TABLE gtt_reuse_table_names (table_name varchar2(30)) 
ON COMMIT DELETE ROWS; 

а затем ссылаться, что в запросах в вашей процедуре, например:

declare 
    v_cnt integer; 
begin 
    insert into gtt_reuse_table_names (table_name) 
    SELECT table_name 
    FROM ALL_TABLES where owner in 'SYS' 
    AND rownum<10; 

    select count(*) 
    into v_cnt 
    from all_tables 
    where table_name in (gtt_reuse_table_names); 

    ... 
end; 
/
0

Я получил ответ от различных поисков,

Я ниже statem ent,

select count(*) into v_cnt from all_tables where ','||v_column||',' like '%,'||table_name||',%' ; 

и он возвращает «9».

спасибо.

 Смежные вопросы

  • Нет связанных вопросов^_^