Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从双表生成多个列_Sql_Oracle_Plsql - Fatal编程技术网

Sql 从双表生成多个列

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

我需要从双表生成多个列。要生成的列数由用户输入决定。如果输入为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 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 := &num;

  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 := &num;
  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 := &num;
new   3:   user_input number := 2;
'ABC','ABC'

PL/SQL procedure successfully completed.

SQL> /
Enter value for num: 5
old   3:   user_input number := &num;
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 := &num;
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 := &num;
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 := &num;
new   3:   user_input number := 9;
'ABC','ABC','ABC','ABC','ABC','ABC','ABC','ABC','ABC'

PL/SQL procedure successfully completed.