|
回复 #13 dingjun123 的帖子
呵呵,多谢你的帮助!以前不知道oracle中有dbms_sql这么个包,我去查了下,果然功能很强大嘎!
所以我按照你的意思又重新写了一个存储过程,不过在中间还是遇到了点问题,我把我写的存储过程发下,
希望你有时间的时候看看,给点意见哈!
CREATE OR REPLACE PROCEDURE GET_BASEDATE_BY_TABLENAME(TABLE_NAME IN VARCHAR2) IS
TYPE CUR IS REF CURSOR;
COL_CUR CUR; --定义一个游标,存放着表TABLE_NAME中每个字段的名称
CURSOR_NAME INTEGER;
CHAR_VALUE VARCHAR2(4000);
ICOUNT INTEGER;
TYPE COL_RECORD IS RECORD(
COLUMN_NAME USER_TAB_COLUMNS.TABLE_NAME%TYPE,--列名
DATA_TYPE USER_TAB_COLUMNS.DATA_TYPE%TYPE,--数据类型
DATA_LENGTH USER_TAB_COLUMNS.DATA_LENGTH%TYPE);--数据长度
MYRECORD COL_RECORD;
BEGIN
--打开游标,记录集为表TABLE_NAME中所有字段的名称
OPEN COL_CUR FOR 'SELECT T.COLUMN_NAME,T.DATA_TYPE,T.DATA_LENGTH FROM USER_TAB_COLUMNS T WHERE T.TABLE_NAME = ''' || TABLE_NAME || '''';
--打开一个动态游标
CURSOR_NAME := DBMS_SQL.OPEN_CURSOR;
--解析要执行的SQL,(SELECT * FROM 表名参数)
DBMS_SQL.PARSE(CURSOR_NAME, 'SELECT * FROM :T_NAME', DBMS_SQL.NATIVE);
--要执行的SQL中需要TABLE_NAME参数.
DBMS_SQL.BIND_VARIABLE(CURSOR_NAME, 'T_NAME', TABLE_NAME);
END GET_BASEDATE_BY_TABLENAME;
上面的存储过程没有写完,写到最后第2行的时候不知道该怎么写了,按照dbms_sql中的写法,
因为我要拿到CURSOR_NAME这个动态游标查询的返回结果,所以我应该要继续写类似下面的代码:
/*使用define_column函数定义返回字段,即用变量v_b来接收查询结果集中处于第n列的的值*/
dbms_sql.define_column(cursor_name, n, v_b);
并且返回的查询结果集中有几个字段,就应该对应有几句dbms_sql.define_column
既然这样,我的想法就是做一个循环,循环次数就是表TABLE_NAME列的数量,表TABLE_NAME列的数量是可以从
USER_TAB_COLUMNS中得到,这个没有问题,所以我写了类似下面的一段代码:
for i in 1 .. col_count loop
dbms_sql.define_column(cursor_name, i, xxx);
end loop;
问题出现了,注意看,在loop循环中的dbms_sql.define_column(cursor_name, i, xxx)语句,
有3个参数,前面2个都没有问题,问题出在了第三个参数上。
我真是想破脑袋都不知道这个XXX该怎么确定啊!
因为首先,xxx是一个变量,是用来接收查询结果中第i列的值的。问题是我申明变量的时候又不知道传进来的表到底有多少列,
那我到底该申明多少个这样的变量呢?并且变量取什么数据类型也不知道啊?
唉,做这么个小小的应用,都搞不定,我真怀疑自己的能力,没办法了,实在是小弟不才,
不知道朋友们哪位知道,希望给的意见,感激不尽!! |
|