表 A 中存放表B的字段 ,如何将查询A表的值 作为 B表的查询字段 从而打到查询B表的效果?
---------一个
表存放字段,另一个表的列就是这些字段  模拟 动态字段查询数据
建表语句如下:
create table gzstorefields(id number ,fieldname varchar(100),datatype varchar(100)
                           ,datadesc varchar(100),orderfield number)
                           
                           
  create table gztest(gzid number,temp1 varchar(10),temp2 varchar(10)
                      ,temp3 varchar(10),temp4 varchar(10));
                      
                      
                      
insert into GZSTOREFIELDS (ID, FIELDNAME, DATATYPE, DATADESC, ORDERFIELD)
values (1, 'temp1', 'varchar(10)', 'temp1', 1);insert into GZSTOREFIELDS (ID, FIELDNAME, DATATYPE, DATADESC, ORDERFIELD)
values (2, 'temp2', 'varchar(10)', 'temp2', 2);insert into GZSTOREFIELDS (ID, FIELDNAME, DATATYPE, DATADESC, ORDERFIELD)
values (3, 'temp3', 'varchar(10)', 'temp3', 3);insert into GZSTOREFIELDS (ID, FIELDNAME, DATATYPE, DATADESC, ORDERFIELD)
values (4, 'temp4', 'varchar(10)', 'temp4', 4);
insert into GZTEST (GZID, TEMP1, TEMP2, TEMP3, TEMP4)
values (1, '1', '11', '111', '1111');insert into GZTEST (GZID, TEMP1, TEMP2, TEMP3, TEMP4)
values (2, '2', '22', '222', '2222');insert into GZTEST (GZID, TEMP1, TEMP2, TEMP3, TEMP4)
values (3, '3', '33', '333', '3333');insert into GZTEST (GZID, TEMP1, TEMP2, TEMP3, TEMP4)
values (4, '4', '44', '444', '4444');          

解决方案 »

  1.   

    --因为你没写具体需求,大概写了一个。供你参考。DECLARE
      TYPE gztest_t1_type IS TABLE OF gztest.temp1%TYPE INDEX BY BINARY_INTEGER;
      TYPE gztest_t2_type IS TABLE OF gztest.temp2%TYPE INDEX BY BINARY_INTEGER;
      TYPE gztest_t3_type IS TABLE OF gztest.temp3%TYPE INDEX BY BINARY_INTEGER;
      TYPE gztest_t4_type IS TABLE OF gztest.temp4%TYPE INDEX BY BINARY_INTEGER;
      v_tmp1 gztest_t1_type;
      v_tmp2 gztest_t2_type;
      v_tmp3 gztest_t3_type;
      v_tmp4 gztest_t4_type;
    BEGIN
      FOR rec IN (SELECT * FROM gzstorefields ORDER BY orderfield) LOOP
        CASE REC.ID
          WHEN 1 THEN
            EXECUTE IMMEDIATE 'SELECT '||REC.FIELDNAME||' FROM gztest ' BULK COLLECT INTO v_tmp1;
          WHEN 2 THEN
            EXECUTE IMMEDIATE 'SELECT '||REC.FIELDNAME||' FROM gztest ' BULK COLLECT INTO v_tmp2;
          WHEN 3 THEN
            EXECUTE IMMEDIATE 'SELECT '||REC.FIELDNAME||' FROM gztest ' BULK COLLECT INTO v_tmp3;
          WHEN 4 THEN
            EXECUTE IMMEDIATE 'SELECT '||REC.FIELDNAME||' FROM gztest ' BULK COLLECT INTO v_tmp4;
          ELSE NULL;
        END CASE;
      END LOOP;
        
        FOR I IN v_tmp1.FIRST..v_tmp1.LAST LOOP
          DBMS_OUTPUT.put_line(v_tmp1(I));
        END LOOP;
          DBMS_OUTPUT.put_line('');
        FOR J IN v_tmp2.FIRST..v_tmp2.LAST LOOP
          DBMS_OUTPUT.put_line(v_tmp2(J));
        END LOOP;
          DBMS_OUTPUT.put_line('');
        FOR K IN v_tmp3.FIRST..v_tmp3.LAST LOOP
          DBMS_OUTPUT.put_line(v_tmp3(K));
        END LOOP;
          DBMS_OUTPUT.put_line('');
        FOR L IN v_tmp4.FIRST..v_tmp4.LAST LOOP
          DBMS_OUTPUT.put_line(v_tmp4(L));
        END LOOP;
          DBMS_OUTPUT.put_line('');
    END;
      

  2.   

    代码请参考1楼,核心问题就是动态SQL语句。
    就是把从表A查询出来的字段的名,存储到一个变量中,然后用这个变量去拼接新的查询SQL语句,用这个SQL语句对B表进行查询。具体拼接就是字符串的连接:IMMEDIATE 'SELECT '||REC.FIELDNAME||' FROM gztest '