ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oralce Dbms_sql封装过程中的主要函数

oralce Dbms_sql封装过程中的主要函数

原创 Linux操作系统 作者:kylemo 时间:2012-03-16 21:32:15 0 删除 编辑

ORACLE应用经验(3)-DBMS_SQL封装过程
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);
   End;


---------------------------- 例子 二  经典--------------------------
CREATE OR REPLACE PROCEDURE testdml_sql (the_rq VARCHAR2)
IS
   the_c1         INTEGER;
   the_result     INTEGER;                                   --dml_sql_result
   m_jls          VARCHAR (20);
   colcnt         INTEGER;                                             --列数
   desctbl        DBMS_SQL.desc_tab;                                   --排序
   colunmvalue    VARCHAR (3000);                                      --变量
   v_price3       VARCHAR (20);
   v_sys_type     VARCHAR (20);
   the_xh         VARCHAR (9);

   TYPE filedvtype_arry IS TABLE OF VARCHAR2 (1000)
      INDEX BY VARCHAR2 (100);                                   --定义索引表

   pkfiled_arry   filedvtype_arry;                  --存储一般关键字 的索引表
   pkfiledcount   NUMBER;                           --索引表集合下标
   arrystr        VARCHAR (1000);                   --用于测试临时存储索引表集合的值
  
  
BEGIN
   the_c1 := DBMS_SQL.open_cursor;
   DBMS_SQL.parse (the_c1,
                   'SELECT uuid, xuhao,price FROM IMS.TABLE1 ',
                   DBMS_SQL.native
                  );  
                                               --解析游标   (parse :解析)
   --取值过程方法 一
   -- (describe_columns  描述列)
   DBMS_SQL.describe_columns (the_c1, colcnt, desctbl);--找出有多少列 

  
   FOR i IN 1 .. colcnt
   LOOP
      DBMS_SQL.define_column (the_c1, i, colunmvalue, 4000);   --循环定义多列
   END LOOP;

   the_result := DBMS_SQL.EXECUTE (the_c1);                  --执行游标中的SQL
   pkfiledcount := 0;

   WHILE (DBMS_SQL.fetch_rows (the_c1) > 0)                         --遍历游标
   LOOP
      DBMS_SQL.COLUMN_VALUE (the_c1, 1, colunmvalue);        --分别取出列的值
      m_jls := colunmvalue;                            --把取的值赋给其它变量
      DBMS_SQL.COLUMN_VALUE (the_c1, 2, colunmvalue);        --分别取出列的值
      v_price3 := colunmvalue;                         --把取的值赋给其它变量
      DBMS_SQL.COLUMN_VALUE (the_c1, 3, colunmvalue);        --分别取出列的值
      v_sys_type := colunmvalue;                       --把取的值赋给其它变量
      pkfiled_arry (pkfiledcount) := m_jls;     --把值赋给索引表
      pkfiledcount := pkfiledcount + 1;         --索引表下标加 1
   END LOOP;

   --取索引表的数据
   FOR i IN 0 .. pkfiledcount - 1
   LOOP
      arrystr := arrystr || ',' || pkfiled_arry (i);
   END LOOP;

   IF arrystr IS NOT NULL
   THEN
      arrystr := SUBSTR (arrystr, 2, LENGTH (arrystr));      --去掉前同面的逗号
   END IF;

---  另一种取值过程方法  取值过程方法 二
   DBMS_SQL.define_column (the_c1, 1, m_jls, 20);                     --定义列
   DBMS_SQL.define_column (the_c1, 2, v_price3, 20);              --单独字义列
   DBMS_SQL.define_column (the_c1, 3, v_sys_type, 20);            --单独字义列
   the_result := DBMS_SQL.EXECUTE (the_c1);                  --执行游标中的SQL

   LOOP
      EXIT WHEN DBMS_SQL.fetch_rows (the_c1) <= 0;                 --遍历游标
      DBMS_SQL.COLUMN_VALUE (the_c1, 1, m_jls);        --按顺序取值并赋给变量
      DBMS_SQL.COLUMN_VALUE (the_c1, 2, v_price3);
      DBMS_SQL.COLUMN_VALUE (the_c1, 3, v_sys_type);
   END LOOP;

   DBMS_SQL.close_cursor (the_c1);
END;

 

 

-------------------------------例子 三  -----------------
/* Formatted on 2012/03/16 23:52 (Formatter Plus v4.8.8) */
DECLARE
   v_cursor   NUMBER;
   v_stat     NUMBER;
   v_row      NUMBER;
   v_id       NUMBER;
   v_no       VARCHAR (100);
   v_date     DATE;
   v_sql      VARCHAR (200);
   s_id       NUMBER;
   s_date     DATE;
BEGIN
   s_id := 3000;
   s_date := SYSDATE;
   v_sql :=
      'SELECT id,qan_no,sample_date FROM ims.tblno WHERE id > :sid and sample_date <

:sdate';
   v_cursor := DBMS_SQL.open_cursor;                             --打开游标;
   DBMS_SQL.parse (v_cursor, v_sql, DBMS_SQL.native);     --解析动态SQL语句;
   DBMS_SQL.bind_variable (v_cursor, ':sid', s_id);          --绑定输入参数;
   DBMS_SQL.bind_variable (v_cursor, ':sdate', s_date);
   DBMS_SQL.define_column (v_cursor, 1, v_id);                       --定义列
   DBMS_SQL.define_column (v_cursor, 2, v_no, 100);
   DBMS_SQL.define_column (v_cursor, 3, v_date);
   v_stat := DBMS_SQL.EXECUTE (v_cursor);                 --执行动态SQL语句。

   LOOP
      EXIT WHEN DBMS_SQL.fetch_rows (v_cursor) <= 0;
                      --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
      DBMS_SQL.COLUMN_VALUE (v_cursor, 1, v_id);
                                     --将当前行的查询结果写入上面定义的列中。
      DBMS_SQL.COLUMN_VALUE (v_cursor, 2, v_no);
      DBMS_SQL.COLUMN_VALUE (v_cursor, 3, v_date);
      DBMS_OUTPUT.put_line (v_id || ';' || v_no || ';' || v_date);
   END LOOP;

   DBMS_SQL.close_cursor (v_cursor);                              --关闭游标。
END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/775341/viewspace-718803/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-07-22

  • 博文量
    3
  • 访问量
    18806