当前位置:  数据库>oracle

Oracle中的动态SQL

    来源: 互联网  发布时间:2017-04-21

    本文导语:       一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。   首先我们应...

      一般的PL/SQL程序设计中,在DML事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。

  首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。

  Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。下面就这两种情况分别进行说明

  一、本地动态SQL

  本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。

  1、本地动态SQL执行DDL语句:

  需求:根据用户输入的表名及字段名等参数动态建表。

create or replace procedure proc_test
Oracle中的动态SQL[图片](
Oracle中的动态SQL[图片]    table_name 

in varchar2,      --表名
Oracle中的动态SQL[图片]
    field1 in varchar2,          --字段名
Oracle中的动态SQL[图片]
    datatype1 in varchar2,       --字段类型
Oracle中的动态SQL[图片]
    field2 in varchar2,          --字段名
Oracle中的动态SQL[图片]
    datatype2 in varchar2        --字段类型
Oracle中的动态SQL[图片]
as 
Oracle中的动态SQL[图片]    str_sql 
varchar2(500);
Oracle中的动态SQL[图片]
begin 
Oracle中的动态SQL[图片]    str_sql:
= ||||table_name||||field1||||datatype1||||field2||||datatype2||;
Oracle中的动态SQL[图片]    
execute immediate str_sql;   --动态执行DDL语句
Oracle中的动态SQL[图片]
    exception when others then 
Oracle中的动态SQL[图片]            
null;
Oracle中的动态SQL[图片]
end; 

   以上是编译通过的存储过程代码。下面执行存储过程动态建表。

Oracle中的动态SQL[图片] SQL> execute proc_test(,,,,);
Oracle中的动态SQL[图片]
Oracle中的动态SQL[图片]       PL

/SQL procedure successfully completed
Oracle中的动态SQL[图片]
Oracle中的动态SQL[图片]  SQL

> desc dinya_test;
Oracle中的动态SQL[图片]       Name Type          Nullable 
Default Comments 
Oracle中的动态SQL[图片]       
---- ------------- -------- ------- --------   
Oracle中的动态SQL[图片]
       ID   NUMBER(8)
Oracle中的动态SQL[图片]
Oracle中的动态SQL[图片]       NAME 

VARCHAR2(100) Y
Oracle中的动态SQL[图片]
Oracle中的动态SQL[图片]  SQL


Oracle中的动态SQL[图片]

    到这里,就实现了我们的需求,使用本地动态SQL根据用户输入的表名及字段名、字段类型等参数来实现动态执行DDL语句。

   2、本地动态SQL执行DML语句。

  需求:将用户输入的值插入到上例中建好的dinya_test表中。

Oracle中的动态SQL[图片]create or replace procedure proc_insert
Oracle中的动态SQL[图片](
Oracle中的动态SQL[图片]    id 

in number,                                 --输入序号
Oracle中的动态SQL[图片]
    name in varchar2                              --输入姓名
Oracle中的动态SQL[图片]
) as 
Oracle中的动态SQL[图片]    str_sql 
varchar2(500);
Oracle中的动态SQL[图片]
begin 
Oracle中的动态SQL[图片]    str_sql:
=;
Oracle中的动态SQL[图片]    
execute immediate str_sql using id,name;      --动态执行插入操作
Oracle中的动态SQL[图片]
    exception when others then 
Oracle中的动态SQL[图片]            
null;
Oracle中的动态SQL[图片]
end; 

  执行存储过程,插入数据测试表中。

Oracle中的动态SQL[图片]  SQL> execute proc_insert(1,);
Oracle中的动态SQL[图片]       PL
/SQL procedure successfully completed
Oracle中的动态SQL[图片]  SQL
select * from dinya_test;
Oracle中的动态SQL[图片]        ID      NAME
Oracle中的动态SQL[图片]        

1       dinya 

  在上例中,本地动态SQL执行DML语句时使用了using子句,按顺序将输入的值绑定到变量,如果需要输出参数,可以在执行动态SQL的时候,使用RETURNING INTO 子句,如:

Oracle中的动态SQL[图片]declare
Oracle中的动态SQL[图片]    p_id 
number:=1;
Oracle中的动态SQL[图片]    v_count 
number;
Oracle中的动态SQL[图片]
begin 
Oracle中的动态SQL[图片]    v_string:
=;
Oracle中的动态SQL[图片]    
execute immediate v_string returning into v_count using p_id;  
Oracle中的动态SQL[图片]
end;

     二、使用DBMS_SQL包

  使用DBMS_SQL包实现动态SQL的步骤如下:
    A、先将要执行的SQL语句或一个语句块放到一个字符串变量中。
    B、使用DBMS_SQL包的parse过程来分析该字符串。
    C、使用DBMS_SQL包的bind_variable过程来绑定变量。
    D、使用DBMS_SQL包的execute函数来执行语句。



  1、使用DBMS_SQL包执行DDL语句

  需求:使用DBMS_SQL包根据用户输入的表名、字段名及字段类型建表。

Oracle中的动态SQL[图片]create or replace procedure proc_dbms_sql
Oracle中的动态SQL[图片](
Oracle中的动态SQL[图片]    table_name 

in varchar2,       --表名
Oracle中的动态SQL[图片]
    field_name1 in varchar2,      --字段名
Oracle中的动态SQL[图片]
    datatype1 in varchar2,        --字段类型
Oracle中的动态SQL[图片]
    field_name2 in varchar2,      --字段名
Oracle中的动态SQL[图片]
    datatype2 in varchar2         --字段类型
Oracle中的动态SQL[图片]
)as
Oracle中的动态SQL[图片]    v_cursor 
number;              --定义光标
Oracle中的动态SQL[图片]
    v_string varchar2(200);       --定义字符串变量
Oracle中的动态SQL[图片]
    v_row number;                 --行数
Oracle中的动态SQL[图片]
begin
Oracle中的动态SQL[图片]    v_cursor:
=dbms_sql.open_cursor;      --为处理打开光标
Oracle中的动态SQL[图片]
    v_string:=||||table_name||||field_name1||||datatype1||||field_name2||||datatype2||;
Oracle中的动态SQL[图片]    dbms_sql.parse(v_cursor,v_string,dbms_sql.native);    
--分析语句
Oracle中的动态SQL[图片]
    v_row:=dbms_sql.execute(v_cursor);   --执行语句,动态SQL执行DDL时可以不写
Oracle中的动态SQL[图片]
    dbms_sql.close_cursor(v_cursor);     --关闭光标
Oracle中的动态SQL[图片]
    exception when others then
Oracle中的动态SQL[图片]            dbms_sql.close_cursor(v_cursor);  
--关闭光标
Oracle中的动态SQL[图片]
            raise;
Oracle中的动态SQL[图片]
end; 

   以上过程编译通过后,执行过程创建表结构

Oracle中的动态SQL[图片]SQL> execute proc_dbms_sql(,,,,);
Oracle中的动态SQL[图片]
Oracle中的动态SQL[图片]           PL

/SQL procedure successfully completed
Oracle中的动态SQL[图片]
Oracle中的动态SQL[图片]SQL

> desc dinya_test2;
Oracle中的动态SQL[图片]           Name Type          Nullable 
Default Comments 
Oracle中的动态SQL[图片]           
---- ------------- -------- ------- -------- 
Oracle中的动态SQL[图片]
           ID   NUMBER(8)                               
Oracle中的动态SQL[图片]          NAME 
VARCHAR2(100) Y                         
Oracle中的动态SQL[图片]
Oracle中的动态SQL[图片]SQL


Oracle中的动态SQL[图片]

    
 
 

您可能感兴趣的文章:

  • 用Oracle动态性能视图采集查询调优数
  • Oracle动态生成查询交叉表
  • 关键字: oracle,存储过程,数据库,查询,动态sql包,数组,参传,jdbc 1
  • Oracle 9i数据库中动态重配置深入分析
  • 在Oracle PL/SQL中游标声明中表名动态变化的方法
  • Oracle组件实现动态Web数据库
  • oracle生成动态前缀且自增号码的函数分享
  • Oracle过程中执行动态SQL或DDL语句
  • 如何用不算很熟练的jsp,oracle,javascript,html,css等建设动态网站,要网页打开速度快、易于日常维护更新?
  • 基于Oracle的高性能动态SQL程序开发
  • Oracle静态注册与动态注册详解
  • Oracle动态交叉表生成
  • Oracle实现动态SQL的拼装要领
  • oracle中动态SQL使用详细介绍
  • oracle 动态AdvStringGrid完美示例 (AdvStringGrid使用技巧/Cells)
  • Oracle9i 动态SGA,PGA特性探索
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle 数据库开发工具 Oracle SQL Developer
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • 取数据库前几条数据(sql server、oracle、mysql)的sql写法
  • Oracle发布Oracle SQL Developer 1.2数据库开发工具 帮助用户简化开发工作
  • oracle用什么SQL语句判断表存不存在
  • 与jsp搭配,oracle好?sql server好?
  • 网间Oracle的连接,远程连接Oracle服务器?? iis7站长之家
  • Oracle与SQL Server区别在哪里
  • oracle sql执行过程(流程图)
  • Oracle的SQL语句中如何处理‘&’符号
  • oracle中得到一条SQL语句的执行时间的两种方式
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • Oracle捕获问题SQL解决CPU过渡消耗
  • Oracle中SQL语句连接字符串的符号使用介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??
  • ORACLE中DBMS_RANDOM随机数生成包
  • 请教:.profile中:if [ -d /opt/oracle/db01/app/oracle/product/9.2.0 ]是什么意思?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3