如何在oracle中构建动态查询?

时间:2012-10-12 15:19:26

标签: sql oracle plsql

我需要从不同的表中读取字段。表的名称写在另一个列中。

即: ENI_FLUSSI_HUB 有一个 FLH_TOUT_NAME 列。我想从 FLH_TOUT_NAME

中指定的表格中读取field1和field2

我想过使用流水线功能。但我必须知道查询会返回的女巫字段..

我需要使用可以在SQL语句中调用的PL / SQL函数来解决问题。

2 个答案:

答案 0 :(得分:1)

declare
 TYPE ref_cursor IS REF CURSOR;
 c_cursor ref_cursor;
--Declare variables stmt, fld1, fld2
begin
 FOR c_rec in (SELECT FLH_TOUT_NAME     
                from ENI_FLUSSI_HUB) --For multiple tables
 LOOP
    stmt := 'SELECT field1, field2 FROM '|| c_rec.FLH_TOUT_NAME;
    open c_cursor for stmt;
    LOOP                             --For multiple rows in table c_rec.FLH_TOUT_NAME
     FETCH c_cursor INTO fld1, fld2;
     exit when c_cursor%notfound;
     dbms_output.put_line ('Table='||c_rec.FLH_TOUT_NAME||' Field 1 ='||fld1||' Field 2='||fld2);
    END LOOP;
 END LOOP;
 ...
 ...
 exception
   ...
   ...
 end;

答案 1 :(得分:0)

declare
  TYPE cur_typ IS REF CURSOR;
  c           cur_typ;
  query_str   VARCHAR2(1000);
  l_tablename VARCHAR2(20);
  l_field1    VARCHAR2(20);
  l_field2    VARCHAR2(20);

BEGIN

  --this assumes only 1 row in ENI_FLUSSI_HUB, if there are more, then use a cursor
  select FLH_TOUT_NAME
  into l_tablename
  from ENI_FLUSSI_HUB;

  query_str := 'SELECT field1, field2 FROM ' || l_tablename;

  OPEN c FOR query_str;
  LOOP
    FETCH c INTO l_field1, l_field2;
    EXIT WHEN c%NOTFOUND;

    dbms_output.put_line('Field1: ' || l_field1);
    dbms_output.put_line('Field2: ' || l_field2);

  END LOOP;
  CLOSE c;
END;
/