从双表生成多列

时间:2017-01-02 11:20:46

标签: 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;

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

答案 2 :(得分:0)

试试这个。在这里你可以输入次数&#39; ABC&#39;在运行时需要作为列:

代码:

<?xml version="1.0" ?><graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.1/graphml.xsd">

演示:

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;