注册
DBMS_SQL 包的使用方法
专栏/金的探索记录/ 文章详情 /

DBMS_SQL 包的使用方法

2021/01/18 1720 1 1
摘要 DBMS_SQL 包的使用方法

什么时候使用DBMS_SQL

  • 解析非常长的的字符串;
  • 得到查询的列的信息;
  • 实现第四种动态 SQL 实现方式的需求。如果用 NDS 实现第四种方法,必须切换到动态 PL/SQL,这需要更高级别的抽象能力;
  • 把动态游标的解析最小化;

调用 DMMS_SQL 需要执行五个步骤

  • 打开一个游标;
  • 分析要执行的语句;
  • 绑定可能需要的任何输入变量;
  • 执行语句;
  • 关闭游标 ;

测试案例

declare cur pls_integer:=DBMS_SQL.open_cursor; cols dbms_sql.desc_tab; ncols pls_integer; vnum number; vtext varchar2(20); v_rows number; begin --解析查询 dbms_sql.parse (cur,'select * from emp_test',dbms_sql.native); --提取列的信息 dbms_sql.describe_columns(cur,ncols,cols); dbms_sql.define_column(cur,6,vnum); dbms_sql.define_column(cur,2,vtext,20); v_rows:=dbms_sql.execute(cur); --显示每一列的名字 /* for col_id in 1 .. ncols loop dbms_output.put_line(cols(col_id).col_name); end loop; dbms_sql.close_cursor(cur); */ --查询取值 loop if dbms_sql.fetch_rows(cur)=0 then exit; end if; dbms_sql.column_value(cur,6,vnum); dbms_sql.column_value(cur,2,vtext); dbms_output.put_line(vtext||' $'||vnum); end loop; dbms_sql.close_cursor(cur); end; --本测例中注释掉的代码可以完成另外一个需求,查询定义列的列名信息。

在使用 DBMS_SQL 包时,如果编译请求失败,而我们又没有明确的在异常处理单元里关闭游标,就可能会出现 ORA-01000:maximum open cursor exceeded 错误。如果用 NDS 就不会发生这种情况,在一个本地作用域声明的游标变量当块结束时,是可以自动关闭的(以及释放内存)。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服