+ -
当前位置:首页 → 问答吧 → 如何使用 动态字段 查询表数据

如何使用 动态字段 查询表数据

时间:2011-12-02

来源:互联网

表 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');

作者: ycscsjj   发布时间: 2011-12-02

--因为你没写具体需求,大概写了一个。供你参考。
SQL code

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;

作者: BenChiM888   发布时间: 2011-12-02