2017-01-02 3 views
2

Мне нужно создать несколько столбцов из двойной таблицы. Количество столбцов, которые должны быть сгенерированы, определяется пользователем. Если ввод 3, то три раза «ABC». Если это 4, то 4 раза «ABC» следует выбирать из двойного. Я пытался объединить все, но я пытаюсь найти более эффективный способ сделать это.создание нескольких столбцов из двух таблиц

DECLARE 
    v_value varchar2(10):='ABC' 
    v_count number:=3; 
    VAR varchar2(4000) 
BEGIN 
    select 'ABC','ABC','ABC' INTO VAR FROM DUAL; 
END; 
+0

зачем вам такие вещи, как это? во всяком случае, я бы использовал динамический sql – Thomas

+0

Прежде всего, как вы можете хранить 4 столбца в 1 переменной?, и для этого вам нужен динамический запрос, если столбцы являются динамическими, а если столбцы фиксированы, вам нужно всего 4 переменных. –

+0

вы можете создать цикл, перейдя на v_count и добавив столько столбца, сколько вам нужно – Thomas

ответ

0

Попробуйте это. Здесь вы можете ввести количество раз «ABC» необходимо как колонки во время выполнения:

Код:

declare 
    user_input number := # 

    var varchar2(10) := '''ABC'''; 
    var1 varchar2(2000); 
    v_sql varchar2(1000); 
    v_res varchar2(4000); 
begin 

    var1 := var; 

    for i in 1 .. user_input - 1 loop 
    var1 := var1 || ',' || var; 
    end loop; 

    var1 := LTRIM(RTRIM(var1, ','), ','); 
    --dbms_output.put_line(var1); 
    v_sql := 'select :var1 from dual'; 
    --dbms_output.put_line(v_sql); 

    Execute immediate v_sql 
    into v_res 
    using var1; 

    dbms_output.put_line(v_res); 

end; 

Демо:

SQL> declare 
    2 
    3 user_input number := # 
    4 
    5 var varchar2(10) := '''ABC'''; 
    6 var1 varchar2(2000); 
    7 v_sql varchar2(1000); 
    8 v_res varchar2(4000); 
    9 begin 
10 
11 var1 := var; 
12 
13 for i in 1 .. user_input - 1 loop 
14  var1 := var1 || ',' || var; 
15 end loop; 
16 
17 var1 := LTRIM(RTRIM(var1, ','), ','); 
18 
19 --dbms_output.put_line(var1); 
20 
21 v_sql := 'select :var1 from dual'; 
22 
23 --dbms_output.put_line(v_sql); 
24 
25 Execute immediate v_sql 
26  into v_res 
27  using var1; 
28 
29 dbms_output.put_line(v_res); 
30 
31 end; 
32/
Enter value for num: 2 
old 3: user_input number := # 
new 3: user_input number := 2; 
'ABC','ABC' 

PL/SQL procedure successfully completed. 

SQL>/
Enter value for num: 5 
old 3: user_input number := # 
new 3: user_input number := 5; 
'ABC','ABC','ABC','ABC','ABC' 

PL/SQL procedure successfully completed. 

SQL>/
Enter value for num: 7 
old 3: user_input number := # 
new 3: user_input number := 7; 
'ABC','ABC','ABC','ABC','ABC','ABC','ABC' 

PL/SQL procedure successfully completed. 

SQL>/
Enter value for num: 6 
old 3: user_input number := # 
new 3: user_input number := 6; 
'ABC','ABC','ABC','ABC','ABC','ABC' 

PL/SQL procedure successfully completed. 

SQL>/
Enter value for num: 9 
old 3: user_input number := # 
new 3: user_input number := 9; 
'ABC','ABC','ABC','ABC','ABC','ABC','ABC','ABC','ABC' 

PL/SQL procedure successfully completed. 
0

Это вы имеете в виду?

select RPAD('ABC',length('ABC')*3,'ABC') from dual 

ABCABCABC


DECLARE 
    v_value varchar2(10):='ABC' 
    v_count number:=3; 
    VAR varchar2(4000) 
BEGIN 
    select RPAD(v_value,length(v_value)*v_count,v_value) INTO VAR FROM DUAL; 
END; 
0

Ваш вопрос не так ясно.

Тот факт, что вы используете переменную VARCHAR2(4000) для вашего значения результата, заставляет меня думать, что вам нужно получить одну строку, состоящую из конкатенации строки n раз; если это так, то вам не нужен select ... from DUAL и может просто сделать:

DECLARE 
    v_value varchar2(10):='ABC'; 
    v_count number:=4; 
    VAR varchar2(4000); 
BEGIN 
    VAR := rpad(v_value, length(v_value) * v_count, v_value); 
    dbms_output.put_line(VAR); 
END; 
/
ABCABCABCABC 

Но вы говорите, что вы пытались UNION, и это заставляет меня думать, что вам нужно, чтобы получить n строк с одинаковым значением; в этом случае вы можете попробовать:

DECLARE 
    type yourResultType is table of varchar2(10);  
    v_value varchar2(10):='ABC'; 
    v_count number:=4; 
    VAR yourResultType; 
BEGIN 
    select v_value 
    bulk collect into VAR 
    from dual 
    connect by level <= v_count; 
    -- 
    for i in VAR.first .. VAR.last loop 
     dbms_output.put_line(VAR(i)); 
    end loop; 
END; 
/
ABC 
ABC 
ABC 
ABC 
Смежные вопросы