Sql 从双表生成多个列
我需要从双表生成多个列。要生成的列数由用户输入决定。如果输入为3,则三次“ABC”。如果是4,则应从双精度中选择4次“ABC”。 我尝试了所有的方法,但我正在寻找更有效的方法Sql 从双表生成多个列,sql,oracle,plsql,Sql,Oracle,Plsql,我需要从双表生成多个列。要生成的列数由用户输入决定。如果输入为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; 这就是你的意思吗 select
DECLARE
v_value varchar2(10):='ABC'
v_count number:=3;
VAR varchar2(4000)
BEGIN
select 'ABC','ABC','ABC' INTO VAR FROM DUAL;
END;
这就是你的意思吗
select RPAD('ABC',length('ABC')*3,'ABC') from dual
ABCABC
你的问题不太清楚 使用
VARCHAR2(4000)
变量作为结果值这一事实使我认为需要获得一个由字符串n
次串联而成的字符串;如果是这种情况,您不需要select。。。从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
声明
类型yourResultType是varchar2(10)的表;
v_值varchar2(10):='ABC';
v_计数编号:=4;
VAR yourResultType;
开始
选择v_值
批量收集到VAR中
来自双重
按级别连接试试这个。在这里,您可以在运行时将“ABC”所需的次数作为列输入:
代码:
演示:
你为什么需要这样的东西?无论如何,我会使用动态SQL首先,如何在一个变量中存储4列?为此,您需要一个动态查询如果列是动态的,如果列是固定的,那么您只需要4个变量。您可以创建一个循环,转到v_count并添加所需的列到所需的列?您可以构建一个查询(即字符串“SELECT…FROM DUAL”),从DUAL中选择“ABC”四次。接下来呢?您想如何使用它?请发布一些预期的输出。您的问题不清楚,并且您的代码示例无法编译,因此很难理解您想要实现什么。
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
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.