日期:2014-05-16  浏览次数:20491 次

PL/SQL之DBMS_SQL程序包使用1
DBMS_SQL程序包
DBMS_SQL程序包是系统提供给我们的另一种使用动态SQL的方法。
使用DBMS_SQL包实现动态的SQL的步骤如下:
(1)将要执行的SQL语句或一个语句块放到一个字符串变量中。
(2)使用DBMS_SQL包的parse过程来分析该字符串。
(3)使用DBMS_SQL包的bind_variable过程来绑定变量。

(4)使用DBMS_SQL包的execute函数来执行语句。

示例1:

--使用DBMS_SQL包执行DDL语句
--需求:使用DBMS_SQL包根据用户输入的表名、字段名以及字段类型建表
DECLARE
  table_name VARCHAR2(20);                   --表名
  field1 VARCHAR2(20);                       --字段名
  datatype1 VARCHAR2(20);                    --字段类型
  field2 VARCHAR2(20);                       --字段名
  datatype2 VARCHAR2(20);                    --字段类型
  v_cursor NUMBER;                           --定义光标
  v_string VARCHAR2(200);                    --定义字符串变量
  v_row NUMBER;                              --行数
BEGIN
  table_name := 't1';
  field1 := 'id';
  datatype1 := 'NUMBER';
  field2 := 'name';
  datatype2 := 'VARCHAR2(20)';
  v_cursor := dbms_sql.open_cursor;          --为处理打开光标
  v_string := 'create table ' || table_name || '('
    || field1 || ' ' || datatype1 || ','
    || field2 || ' ' || datatype2 || ')';
  dbms_sql.parse(v_cursor,v_string,dbms_sql.native);  --分析语句
  v_row := dbms_sql.execute(v_cursor);                --执行动态SQL
  dbms_sql.close_cursor(v_cursor);                    --关闭光标
  dbms_output.put_line(v_row);
  EXCEPTION
    WHEN OTHERS THEN
      IF dbms_sql.is_open(v_cursor) THEN
        dbms_sql.close_cursor(v_cursor);
      END IF;
END;

示例2:

--使用DBMS_SQL包执行DML语句
--需求:使用DBMS_SQL包将表中t1中id=1的名称改为李四
DECLARE
  v_id NUMBER;
  v_name VARCHAR2(20);
  v_cursor NUMBER;                                    --定义光标
  v_string VARCHAR2(200);                             --字符串变量
  v_row NUMBER;                                       --行数
BEGIN
  v_id := 1;
  v_name := '李四';
  v_cursor := dbms_sql.open_cursor;                   --为处理打开游标
  v_string := 'update t1 set name = :p_name where id = :p_id';
  dbms_sql.parse(v_cursor,v_string,dbms_sql.native);  --分析语句
  dbms_sql.bind_variable(v_cursor,'p_name',v_name);   --绑定变量
  dbms_sql.bind_variable(v_cursor,'p_id',v_id);       --绑定变量
  v_row := dbms_sql.execute(v_cursor);                --执行动态SQL
  dbms_sql.close_cursor(v_cursor);
  EXCEPTION
    WHEN OTHERS THEN 
      IF dbms_sql.is_open(v_cursor) THEN
        dbms_sql.close_cursor(v_cursor);
      END IF;
END;