【问题标题】:How to pass a column value from FOR LOOP to select into query using ORACLE?如何将 FOR LOOP 中的列值传递给使用 ORACLE 的查询?
【发布时间】:2018-10-05 19:08:54
【问题描述】:

我正在尝试将值从 For 循环传递到 Select 到查询中。但它未能传递价值。相反,它显示字符串。以下是我的相似查询。

DECLARE

filters  VARCHAR2(4000);

BEGIN

    FOR SRC IN (SELECT ABC , EFG , HIJ ,KLM FROM table_name WHERE rownum < 2)

    LOOP

    FILTERs := '';

    FOR con IN (SELECT DISTINCT cols.column_name AS COL FROM all_constraints cons, all_cons_columns cols
                WHERE cols.table_name = table_name
                AND cons.constraint_type = 'P'
                AND cons.constraint_name = cols.constraint_name
                AND cons.owner = OWNER_NAME)                
    LOOP

    select filters || con.col || ' = ''''''|| SRC.' ||con.col||'||'''''' AND ' INTO filters FROM dual;

    END LOOP;   

    dbms_output.put_line(Filters);

    END LOOP;
END;

我得到的输出是:

ABC = '''|| SRC.ABC||''' AND EFG = '''|| SRC.EFG||''' AND 

但我期望的是:

ABC = '1234' AND EFG = '5678' AND

我该怎么做?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    这个代码块对我有用。此处必须使用动态 SQL。

    样本数据:

    create table table_name(abc, efg, hij, klm) as (
        select '1234', '5678', 'PQR', 'XYZ' from dual union all
        select '1221', '8688', 'ABQ', 'ZAA' from dual 
        );
    alter table table_name add constraint tn_pk primary key (abc, efg);
    

    代码块:

    declare
      v_flt varchar2(4000);
      v_val varchar2(1000);
      v_sql varchar2(4000);
    begin
      for r in (select rowid rwd from table_name where rownum <= 2) loop
          v_flt := '';
          for con in (select column_name col
                        from all_constraints  cons
                        join all_cons_columns cols using (owner, table_name, constraint_name)
                        where owner = 'SCOTT' 
                          and table_name = 'TABLE_NAME' 
                          and constraint_type = 'P') 
          loop
            v_sql := 'select '||con.col||' from table_name where rowid = '''||r.rwd||'''' ;
            execute immediate v_sql into v_val;
            v_flt := v_flt ||con.col||' = '''||v_val||''' AND ';
          end loop;
          dbms_output.put_line(v_flt);
      end loop;
    end;
    

    结果:

    ABC = '1221' AND EFG = '8688' AND 
    ABC = '1234' AND EFG = '5678' AND 
    

    【讨论】:

    • 非常感谢!!它帮助了我一半。但是为什么它只能打印一行,尽管我们给出了 rownum
    • 不知道。如果您能够提供可重现的示例(数据和您的确切代码),我们可以提供帮助。在我的示例中,您可以遍历一、二、所有行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多