如何使用游标值作为字段名称使用?
现有一个存储过程,需求:从test1中取所有表字段,然后再计算每个字段=25的总记录数,把结果写入表:create or replace procedure pro_2k1w_zd is
num1 number(10);cursor sum_fee1 is
   select cname from col where lower(tname)='test1';
   begin
   delete from temp_ke;
   for feesum in sum_fee1
   loop
   num1 :=1;
   select count(*) into num1 FROM test1 where feesum.CNAME = '25' ;
   insert into temp_ke (zdm,zdnum) values (feesum.CNAME,num1);
   end loop;
end pro_2k1w_zd;   目前问题是:select count(*) into num1 FROM test1 where feesum.CNAME = '25' ; 这句没执行,应该是其中的
feesum.CNAME = '25' 写法不对,请教各位这句如何写,就是使用游标的值作为字段来使用,谢谢了!

解决方案 »

  1.   

    table test1 两个字段如下
    id   number
    old  number现在我想计算每个字段中值为25的记录数,然后把结果:字段名,总数写到表
    temp_ke 中,字段为
    zdm  varchar(10)
    zdnum number
      

  2.   

    建表及测试数据CREATE TABLE Test1
    (
        ID NUMBER(4),
        older NUMBER(4)
    );INSERT INTO Test1 VALUES(1, 23);
    INSERT INTO Test1 VALUES(25, 4);
    INSERT INTO Test1 VALUES(2, 25);
    INSERT INTO Test1 VALUES(25, 1);
    INSERT INTO Test1 VALUES(3, 25);
    INSERT INTO Test1 VALUES(4, 23);
    INSERT INTO Test1 VALUES(5, 25);CREATE TABLE temp_ke
    (
        zdm VARCHAR(10),
        adnum NUMBER(4)
    )
    存储过程:CREATE OR REPLACE PROCEDURE ProcedureTest1 IS
        -- 定义光标,从user_tab_columns数据字典中检索列名
        CURSOR c1 IS SELECT column_name FROM user_tab_columns WHERE table_name = 'TEST1';
        -- 保存列名
        vColumnName VARCHAR2(20);
        -- 保存记录个数
        vNum NUMBER(4);
        vSQL VARCHAR2(200);
    BEGIN
        FOR r IN c1
        LOOP
            vColumnName := r.column_name;
            vSQL := 'SELECT COUNT(1) FROM Test1 WHERE ' || vColumnName || '=25';
            EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM Test1 WHERE ' || vColumnName || '=25'
            INTO vNum;
            
            EXECUTE IMMEDIATE 'INSERT INTO temp_ke VALUES(:1, :2)'
            USING  vColumnName, vNum;
            
            
        END LOOP;
        COMMIT;
    END ProcedureTest1;
    测试结果: