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;