2017-01-02 63 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

首先,如何將1列中的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