简体   繁体   English

Oracle 12c-SQL字符串构建问题

[英]Oracle 12c - SQL string build issue

This is a follow up to a previous question: Dynamically build select statement in Oracle 12c 这是上一个问题的后续内容: 在Oracle 12c中动态构建select语句

I am trying to build a select statement dynamically but having a problem building the column alias names. 我正在尝试动态构建一个select语句,但是在构建列别名时遇到了问题。 The column alias name must be retrieved from MAIN_TABLE. 必须从MAIN_TABLE中检索列别名。 Please refer to the code inside <> below: 请参考下面<>中的代码:

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;

This was my attempt: 这是我的尝试:

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;

My attempted result: 我的尝试结果:

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

My expected result: 我的预期结果:

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

How can I achieve this? 我该如何实现?

I have figured out how to achieve expected result: 我已经弄清楚如何达到预期的结果:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM