【问题标题】:Oracle 12c - SQL string build issueOracle 12c - SQL 字符串构建问题
【发布时间】:2014-07-23 19:52:21
【问题描述】:

这是对上一个问题的跟进:Dynamically build select statement in Oracle 12c

我正在尝试动态构建 select 语句,但在构建列别名时遇到问题。必须从 MAIN_TABLE 中检索列别名。请参考下面里面的代码:

declare
    upper_level number;
    t_sql varchar2(1000);
    t_sql_val varchar2(500);
    l_sql varchar2(1000);
begin

--upper_level will always be given
    select 3 into upper_level from dual;

--build the fixed string
    l_sql:='SELECT ID,
     Title,
     Desc,
     Type,';


    for lvl in 1..upper_level
     loop
--build the column names and alias names
         t_sql:=t_sql||'TYPE_'||lvl||' <SELECT TYPE_'||lvl||' FROM MAIN_TABLE WHERE ID = 1>,';

     end loop;

--finish building the statement     
     t_sql:=rtrim(t_sql,',');
     l_sql:=l_sql||t_sql;
     l_sql:=l_sql||' FROM SCHEMA.TABLE
    WHERE ID = 1;';

--dbms_output.put_line(l_sql);

end;

这是我的尝试:

declare
    upper_level number;
    t_sql varchar2(1000);
    v_sql varchar2(1000);
    v_sql_val varchar2(1000);
    t_sql_val varchar2(500);
    l_sql varchar2(1000);
begin

--upper_level will always be given
    select 3 into upper_level from dual;

--build the fixed string
    l_sql:='SELECT ID,
     Title,
     Desc,
     Type,';


    for lvl in 1..upper_level
     loop
--build the column names and alias names
         t_sql:='TYPE_'||lvl||;
         v_sql:='SELECT '||t_sql||' FROM MAIN_TABLE WHERE ID=1';
         EXECUTE IMMEDIATE v_sql into v_sql_val;
         t_sql:=t_sql||' '||v_sql_val||',';
     end loop;

--finish building the statement     
     t_sql:=rtrim(t_sql,',');
     l_sql:=l_sql||t_sql;
     l_sql:=l_sql||' FROM SCHEMA.TABLE
    WHERE ID = 1;';

dbms_output.put_line(l_sql);

end;

我的尝试结果:

SELECT ID,
     Title,
     Desc,
     Type,TYPE_3 LVL_3 FROM SCHEMA.TABLE
    WHERE ID = 1;

我的预期结果:

SELECT ID,
     Title,
     Desc,
     Type,TYPE_1 LVL_1, TYPE_2 LVL_2, TYPE_3 LVL_3 FROM SCHEMA.TABLE
    WHERE ID = 1;

我怎样才能做到这一点?

【问题讨论】:

    标签: sql dynamic plsql oracle12c


    【解决方案1】:

    我已经想出了如何达到预期的效果:

    declare
        upper_level number;
        t_sql varchar2(1000);
        v_sql varchar2(1000);
        v_sql_val varchar2(1000);
        t_sql_val varchar2(500);
        l_sql varchar2(1000);
    begin
    
    --upper_level will always be given
        select 3 into upper_level from dual;
    
    --build the fixed string
        l_sql:='SELECT ID,
         Title,
         Desc,
         Type,';
    
    
        for lvl in 1..upper_level
         loop
    --build the column names and alias names
         t_sql:=t_sql||'TYPE_'||lvl||'_CD';
         v_sql:='SELECT TYPE_'||lvl||'_CD FROM MAIN_TABLE WHERE ID=1';
         EXECUTE IMMEDIATE v_sql into v_sql_val;
         t_sql:=t_sql||' '||v_sql_val||',';
         end loop;
    
    --finish building the statement     
         t_sql:=rtrim(t_sql,',');
         l_sql:=l_sql||t_sql;
         l_sql:=l_sql||' FROM SCHEMA.TABLE
        WHERE ID = 1;';
    
    dbms_output.put_line(l_sql);
    
    end;
    

    【讨论】:

    • 所以你的选择语句会是这样的 SELECT ID, Title, Desc, Type,Type_1_CD .... Type_2_CD .. ??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多