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