问题描述
嗨,汤姆,
我有一个要求,其中在plsql中执行保存在表列 (clob类型) 中的sql。然后将结果用于进一步处理。
要执行的sql将根据一些标准来选择。
例如: 假设表名是查询,并且我有2条记录,每条记录都具有不同的sql
sl。查询 _ txt
1从人员a,地点b中选择名称,dob,地址a.address_id = b.id
2选择地址,st,zip,其中人a,运输地址b,其中a.address_id = b.address_id
我想要一个单一的过程执行query1或query2基于一些条件和捕获的结果进一步处理。可以使用DBMS_SQL包完成此操作吗?
我有一个要求,其中在plsql中执行保存在表列 (clob类型) 中的sql。然后将结果用于进一步处理。
要执行的sql将根据一些标准来选择。
例如: 假设表名是查询,并且我有2条记录,每条记录都具有不同的sql
sl。查询 _ txt
1从人员a,地点b中选择名称,dob,地址a.address_id = b.id
2选择地址,st,zip,其中人a,运输地址b,其中a.address_id = b.address_id
我想要一个单一的过程执行query1或query2基于一些条件和捕获的结果进一步处理。可以使用DBMS_SQL包完成此操作吗?
专家解答
下面是我如何使用DBMS_SQL输出任何查询 “向下页面” 的示例,但它显示了使用DBMS_SQL访问未知数量的列和行的原理。
SQL> set serverout on size 999999 SQL> declare 2 p_query varchar2(32767) := 'select * from scott.emp'; 3 4 l_theCursor integer default dbms_sql.open_cursor; 5 l_columnValue varchar2(4000); 6 l_status integer; 7 l_descTbl dbms_sql.desc_tab; 8 l_colCnt number; 9 n number := 0; 10 procedure p(msg varchar2) is 11 l varchar2(4000) := msg; 12 begin 13 while length(l) > 0 loop 14 dbms_output.put_line(substr(l,1,80)); 15 l := substr(l,81); 16 end loop; 17 end; 18 begin 19 dbms_sql.parse( l_theCursor, p_query, dbms_sql.native ); 20 dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl ); 21 22 for i in 1 .. l_colCnt loop 23 dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000); 24 end loop; 25 26 l_status := dbms_sql.execute(l_theCursor); 27 28 while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop 29 for i in 1 .. l_colCnt loop 30 dbms_sql.column_value( l_theCursor, i, l_columnValue ); 31 p( rpad( l_descTbl(i).col_name, 30 ) 32 || ': ' || 33 l_columnValue ); 34 end loop; 35 dbms_output.put_line( '-----------------' ); 36 n := n + 1; 37 end loop; 38 if n = 0 then 39 dbms_output.put_line( chr(10)||'No data found '||chr(10) ); 40 end if; 41 end; 42 / EMPNO : 7369 ENAME : SMITH JOB : CLERK MGR : 7902 HIREDATE : 17-DEC-80 SAL : 800 COMM : DEPTNO : 20 ----------------- EMPNO : 7499 ENAME : ALLEN JOB : SALESMAN MGR : 7698 HIREDATE : 20-FEB-81 SAL : 1600 COMM : 300 DEPTNO : 30 ----------------- EMPNO : 7521 ENAME : WARD JOB : SALESMAN MGR : 7698 HIREDATE : 22-FEB-81 SAL : 1250 COMM : 500 DEPTNO : 30 ----------------- EMPNO : 7566 ENAME : JONES JOB : MANAGER MGR : 7839 HIREDATE : 02-APR-81 SAL : 2975 COMM : DEPTNO : 20 ----------------- EMPNO : 7654 ENAME : MARTIN JOB : SALESMAN MGR : 7698 HIREDATE : 28-SEP-81 SAL : 1250 COMM : 1400 DEPTNO : 30 ----------------- EMPNO : 7698 ENAME : BLAKE JOB : MANAGER MGR : 7839 HIREDATE : 01-MAY-81 SAL : 2850 COMM : DEPTNO : 30复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。