我以前用过动态SQL 把一个表的所有列名读出来拼接起来,然后用DBMS_SQL动态游标获取每一行每个字段的记录,然后把这些记录放进另一个表B。具体如下: 如果只是要动态获取每一行的数据(比如每行的数据字段是用字符串拼接起来导致数量不一致时)的逐个字段的话,步骤可以是: 通常运用DBMS_SQL的步骤: 1. open cursor: 打开cursor 2. parse cursor:解析你要执行的SQL语句 3. define column:定义要解析的变量顺序(如果变量时字符串的话,那么还要有第四个字段,用于指定该字段字符串大小,不然会报错) 4. execute:执行SQL语句 5. Fetch rows然后column_value,来取值 6. close cursor:在执行后关闭此cursor.工作示例:n_cur number; --定义一个变量,当做游标句柄dbms_sql.parse(n_cur, v_sql, dbms_sql.native); --解析SQL语句到句柄for i in 1..n_NumKeys loop dbms_sql.define_column(n_cur,i,KeyStr_Array(i),200); --动态指定哪个字段写到哪个变量,并且字符串大小为200 end loop; n_sqlres := dbms_sql.execute(n_cur); -- 执行 loop if dbms_sql.fetch_rows(n_cur) > 0 then -- 获取每行的数据 for i in 1..n_NumKeys loop dbms_sql.column_value(n_cur,i,KeyStr_Array(i)); --每行逐个写到指定变量里,照目前来看,这个KeyStr_Array(i)和define_column里面的第三个是一样的,看来只是个规则…… end loop; else exit; end if; end loop;dbms_sql.close(n_cur); --关闭动态游标
如果只是要动态获取每一行的数据(比如每行的数据字段是用字符串拼接起来导致数量不一致时)的逐个字段的话,步骤可以是:
通常运用DBMS_SQL的步骤:
1. open cursor: 打开cursor
2. parse cursor:解析你要执行的SQL语句
3. define column:定义要解析的变量顺序(如果变量时字符串的话,那么还要有第四个字段,用于指定该字段字符串大小,不然会报错)
4. execute:执行SQL语句
5. Fetch rows然后column_value,来取值
6. close cursor:在执行后关闭此cursor.工作示例:n_cur number; --定义一个变量,当做游标句柄dbms_sql.parse(n_cur, v_sql, dbms_sql.native); --解析SQL语句到句柄for i in 1..n_NumKeys loop
dbms_sql.define_column(n_cur,i,KeyStr_Array(i),200); --动态指定哪个字段写到哪个变量,并且字符串大小为200
end loop;
n_sqlres := dbms_sql.execute(n_cur); -- 执行
loop
if dbms_sql.fetch_rows(n_cur) > 0 then -- 获取每行的数据
for i in 1..n_NumKeys loop
dbms_sql.column_value(n_cur,i,KeyStr_Array(i)); --每行逐个写到指定变量里,照目前来看,这个KeyStr_Array(i)和define_column里面的第三个是一样的,看来只是个规则……
end loop;
else
exit;
end if;
end loop;dbms_sql.close(n_cur); --关闭动态游标