lz是不是想要这些值? select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='表名字大写';
可以查询数据字典,获得表的各个列的类型长度 select * from user_tab_columns where table_name='你的表名';
不是。 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 谢谢!
还是不是十分清楚,是不是只想取游标的内容? fetch value_cur into 变量1,变量2,变量3; 不知道是不是这个意思
是想取游标内容,但是因为是写在过程里的,希望对于不同的表结构都能使用,所以不能指定列名1,列名2,列名3的名字,也不能指定变量1,变量2,变量3的类型。(列名和数据类型都可以从select * from user_tab_columns where table_name='你的表名'里面动态的读出来)
哦,明白你的意思了,你想动态维护这个游标是吧, 可以用下面的方式动态创建游标 open value_cur for 'select '||可以把动态列名字放这里||' from table'; 取值的时候,定义变量可以定义成这个类型value_cur%rowtype 然后向变量里fetch结果就好了
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;
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;
请问在不知道列名的情况下,如何遍历rowtype或游标中的各个列,是否有索引方式或者别的方法?
我想写一个存储过程或者函数,判断本表各个列是否发生了改变。因为这个过程(函数)要在本表前触发器里的调用,所以不能select本表。
select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='表名字大写';
select * from user_tab_columns where table_name='你的表名';
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
谢谢!
fetch value_cur into 变量1,变量2,变量3;
不知道是不是这个意思
可以用下面的方式动态创建游标
open value_cur for 'select '||可以把动态列名字放这里||' from table';
取值的时候,定义变量可以定义成这个类型value_cur%rowtype
然后向变量里fetch结果就好了
不知道你有没有看过我6楼请你参考的帖子,有两个问题。
1.这个过程是用在前触发器里的,前触发器不允许select本表。(表很多很大,不可能采用临时表的方法)
2.用动态游标转化成动态sql的问题以后,怎么取出:NEW和:OLD呢?
FOR EACH ROW 我是说这种触发器。
如果是这个意思的话,你从数据字典里可以直接取出表各个列的最新类型,至于这些列之前是什么类型,这个除非有记录这些信息的表,否则应该很难实现