贫民窟里的程序高手

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

本文转载自:http://blog.sina.com.cn/s/blog_4b9b16b301000ps8.html

DBMS_SQL package 学习

 

这个包提供了一种使用动态sql来访问数据库的方法。

第一步:打开游标

使用函数 function open_cursor return integer;

定义变量 Cur_1 integer; --返回的新游标的ID值

语句是Cur_1 := Dbms_Sql.Open_Cursor;

第二步:解析要执行的语句

使用过程procedure parse(c in integer, statement in varchar2,                  language_flag in integer);

语句是Dbms_Sql.Parse(Cur_1, ’sql语句’, Dbms_Sql.V7);

第三步:定义字段变量,其值对应于指定游标中某个位置元素的值(仅用于SELECT语句)

使用过程procedure define_column(c in integer, position in integer, column in number);

语句是Dbms_Sql.Define_Column(Cur_1, 1, column);

定义第一列为column,可重复定义多个列;

第四步:执行指定游标

使用过程function execute(c in integer) return integer;--返回行数

语句是Rows_1 := Dbms_Sql.EXECUTE(Cur_1);

第五步:从指定的游标中取出记录

使用过程function fetch_rows(c in integer) return integer;--返回行数

采用If Dbms_Sql.Fetch_Rows(Cur_1) > 0 then 判断是否取到数据了

然后返回游标中指定位置的元素,使用过程procedure column_value(c in integer, position in integer, value out number);

语句是Dbms_Sql.Column_Value(Cur_1, 1, column);

把游标中的第一列的值赋值给column,可重复赋值多个列;

要加上end if;

最后关闭游标

语句是Dbms_Sql.Close_Cursor(Cur_1);

 

以下是网上找到的一个例子

DBMS_SQL封装过程中主要函数
1、OPEN_CURSOR:返回新游标的ID值
2、PARSE:解析要执行的语句
3、BIND_VARIABLE:将给定的数量与特定的变量相连接
4、DEFINE_COLOUMN:定义字段变量,其值对应于指定游标中某个位置元素的值
(仅用于SELECT语句)
5、EXECUTE:执行指定的游标
6、EXECUTE_AND_FETCH:执行指定的游标并取记录
7、FETCH_ROWS:从指定的游标中取出记录
8、COLUMN_VALUE:返回游标中指定位置的元素
9、IS_OPEN:当指定的游标状态为OPEN时返回真值
10、CLOSE_CURSOR:关闭指定的游标并释放内存
11、LAST_ERROR_POSITION:返回出错SQL语句的字节偏移量
12、LAST_ROW_ID:返回最后一条记录的ROWID
13、LAST_SQL_FUNCTION_CODE:返回语句的SQL FUNCTION CODE

例:
CREATE OR REPLACE
procedure dml_sql (the_rq varchar2) as
The_c1 Integer;
The_result Integer;--dml_sql_result
M_jls number;
The_xh varchar2(2);
Begin
The_xh:=lpad(ltrim(the_rq),2,'0');
The_C1 :=Dbms_sql.open_cursor;
Dbms_sql.parse(the_C1,'select count(*) from user_indexes
where table_name =''ZDCHB'''||the_xh,dbms_sql.v7);
Dbms_sql.define_column(the_c1,1,M_jls);
The_result:=Dbms_sql.execute(The_c1);
If dbms_sql.fetch_rows(cursor1) > 0 then
Dbms_sql.column_value(cursor1,1,M_jls);
End if;
Dbms_sql.close_cursor(The_C1);

posted on 2011-09-15 11:26  贫民窟里的程序高手  阅读(1245)  评论(0编辑  收藏  举报