码迷,mamicode.com
首页 > 数据库 > 详细

PL/SQL之DBMS_SQL程序包使用(1)(学习笔记)

时间:2015-01-09 22:15:56      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

dbms_sql程序包
dbms_sql程序包是系统提供给我们的另一种使用动态SQL的方法:
使用DBMS_SQL包实现动态的SQL的步骤如下:
1.将要执行的SQL语句或者一个语句放到一个字符串变量中
2.使用DBMS_SQL包的parse过程来分析该字符串
3.使用DBMS_SQL包的bind_varable过程绑定变量
4.使用DMBS_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 := t2;
  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); --执行语句
  DBMS_SQL.CLOSE_CURSOR(V_CURSOR); --关闭光标
  DBMS_OUTPUT.PUT_LINE(V_ROW);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(V_CURSOR); --关闭光标
END;
SELECT * FROM t2;

示例2:

--使用DBMS_SQL包执行DML语句insert 
DECLARE
 ID        NUMBER:=&ID;
 NAME      VARCHAR2(20):=&name;
 v_cursor     NUMBER;                                  --定义光标
 v_string     VARCHAR2(200);                           --定义字符串变量 
 v_row      NUMBER;                                    --行数变量
BEGIN

  v_cursor:=dbms_sql.open_cursor;                          --打开光标
  v_string:=insert into t2 values(:id,:name);
  dbms_sql.parse(v_cursor,v_string,dbms_sql.native);       --分析语句
    dbms_sql.bind_variable(v_cursor,id,ID);              --绑定变量
  dbms_sql.bind_variable(v_cursor,name,NAME);          --绑定变量
  v_row:=dbms_sql.execute(v_cursor);                     --执行动态SQL
  COMMIT;
  dbms_sql.close_cursor(v_cursor);                        --关闭光标
  EXCEPTION
  WHEN OTHERS THEN
    dbms_sql.close_cursor(v_cursor);                      --关闭光标
  
 END;

示例3:

-使用DBMS_SQL包执行DML语句
--需求:使用DBMS_SQL包将表中t2的id=1的名称改为Marry
DECLARE
  ID       NUMBER := &ID;
  NAME     VARCHAR2(20) := &NAME;
  V_CURSOR NUMBER; --定义光标
  V_STRING VARCHAR2(200); --定义字符串变量 
  V_ROW    NUMBER; --行数变量
BEGIN

  V_CURSOR := DBMS_SQL.OPEN_CURSOR; --打开光标
  V_STRING := update t2 set name=:name where id=:id;
  DBMS_SQL.PARSE(V_CURSOR, V_STRING, DBMS_SQL.NATIVE); --分析语句
  DBMS_SQL.BIND_VARIABLE(V_CURSOR, name, NAME); --绑定变量
  DBMS_SQL.BIND_VARIABLE(V_CURSOR, id, ID); --绑定变量
  V_ROW := DBMS_SQL.EXECUTE(V_CURSOR); --执行动态SQL
  COMMIT;
  DBMS_SQL.CLOSE_CURSOR(V_CURSOR); --关闭光标
EXCEPTION
  WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(V_CURSOR); --关闭光标
    RAISE;
END;

 示例4:

--使用DBMS_SQL包执行DML语句delete
DECLARE
  ID       NUMBER := &ID; --定义id
  V_CURSOR NUMBER; --定义光标
  V_ROW    NUMBER; --定义行数
  V_STRING VARCHAR2(200); --定义字符串变量
BEGIN
  
  V_CURSOR:=DBMS_SQL.OPEN_CURSOR; --打开光标
  V_STRING := delete from t2 where id=:id;
  DBMS_SQL.PARSE(V_CURSOR, V_STRING, DBMS_SQL.NATIVE); --分析语句
  DBMS_SQL.BIND_VARIABLE(V_CURSOR, id, ID);  --绑定字段ID
  V_ROW := DBMS_SQL.EXECUTE(V_CURSOR);    --执行动态SQL
  COMMIT;
  DBMS_SQL.CLOSE_CURSOR(V_CURSOR);    --关闭光标
EXCEPTION
  WHEN OTHERS THEN
    DBMS_SQL.CLOSE_CURSOR(V_CURSOR); --关闭光标
    RAISE;
END;

 

PL/SQL之DBMS_SQL程序包使用(1)(学习笔记)

标签:

原文地址:http://www.cnblogs.com/liunanjava/p/4214209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!