有两个游标value_cur和column_cur。
其中value_cur存了一张表各个列的值,
    column_cur存了一张表各个列的列名。
我想通过“游标名.列名”方式得到列值,或者有什么别的方法吗?
谢谢!

解决方案 »

  1.   

    可以先用游标产生sql语句,然后用dbms_sql包,创建动态游标
    PROCEDURE sS (sqlyj in varchar2)IS
            STR VARCHAR2(100);
    mycursor INTEGER; 
    ignore INTEGER;
    begin
    mycursor := dbms_sql.open_cursor;
    dbms_sql.parse(mycursor, sqlyj,1);
      DBMS_SQL.DEFINE_COLUMN(mycursor,1,str,1000); 
    ignore := dbms_sql.execute(mycursor);
    while DBMS_SQL.FETCH_ROWS(mycursor)<> 0 loop
    DBMS_SQL.COLUMN_VALUE(mycursor,1,str);
    END loop; 
    dbms_sql.close_cursor(mycursor);
    END;
      

  2.   

    下面的函数返回的sql语句查询结果的第一行的第一列的值
    FUNCTION sinto (sqlyj in varchar2) RETURN varchar2 IS
      str varchar2(22);
    mycursor INTEGER; 
    ignore INTEGER;
    mytab varchar2(100);
    begin
    mycursor := dbms_sql.open_cursor;
    dbms_sql.parse(mycursor,sqlyj,1);
      DBMS_SQL.DEFINE_COLUMN(mycursor,1,str,22); 
    ignore := dbms_sql.execute(mycursor);
    if DBMS_SQL.FETCH_ROWS(mycursor)<> 0 then
    DBMS_SQL.COLUMN_VALUE(mycursor,1,str);
    end if;
    dbms_sql.close_cursor(mycursor);
    return str;
    END;
      

  3.   

    先谢谢你。不过我想我的问题描述的不清楚:
    请问在不知道列名的情况下,如何遍历rowtype或游标中的各个列,是否有索引方式或者别的方法?
    我想写一个存储过程或者函数,判断本表各个列是否发生了改变。因为这个过程(函数)要在本表前触发器里的调用,所以不能select本表。
      

  4.   

    lz是不是想要这些值?
    select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='表名字大写';
      

  5.   

    可以查询数据字典,获得表的各个列的类型长度
    select * from user_tab_columns where table_name='你的表名';
      

  6.   

    不是。
    column_cur存了信息:select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='TABLE_NAME_1';
    value_cur存了TABLE_NAME_1中的这些信息::OLD.column_name_1,:OLD.column_name_2,:OLD.column_name_3;
    我现在想把value_cur里面这些值取出来。
    请参考这个帖子:http://topic.csdn.net/u/20090523/14/4d44db68-31cc-417c-9c82-a1b7f6dcf030.html
    谢谢!
      

  7.   

    还是不是十分清楚,是不是只想取游标的内容?
    fetch value_cur into 变量1,变量2,变量3;
    不知道是不是这个意思
      

  8.   

    是想取游标内容,但是因为是写在过程里的,希望对于不同的表结构都能使用,所以不能指定列名1,列名2,列名3的名字,也不能指定变量1,变量2,变量3的类型。(列名和数据类型都可以从select * from user_tab_columns where table_name='你的表名'里面动态的读出来)
      

  9.   

    哦,明白你的意思了,你想动态维护这个游标是吧,
    可以用下面的方式动态创建游标
    open value_cur for 'select '||可以把动态列名字放这里||' from table';
    取值的时候,定义变量可以定义成这个类型value_cur%rowtype
    然后向变量里fetch结果就好了
      

  10.   

    1楼2楼说的也是这个意思。
    不知道你有没有看过我6楼请你参考的帖子,有两个问题。
    1.这个过程是用在前触发器里的,前触发器不允许select本表。(表很多很大,不可能采用临时表的方法)
    2.用动态游标转化成动态sql的问题以后,怎么取出:NEW和:OLD呢?
      

  11.   

    CREATE OR REPLACE TRIGGER trigger_delete_on_table_1 BEFORE DELETE ON table_1
    FOR EACH ROW 我是说这种触发器。
      

  12.   

    哦,你的意思我大体了解了,你是不是想在删除table_1的数据前判断表的各列类型是否发生了变化。
    如果是这个意思的话,你从数据字典里可以直接取出表各个列的最新类型,至于这些列之前是什么类型,这个除非有记录这些信息的表,否则应该很难实现
      

  13.   

    是啊,所以想用动态sql解决估计是没戏咯~~
      

  14.   

    这个是几乎不可能实现的,要想取得数据修改前后的值,只有一种可能,那就是在修改数据时,即after update触发器里