当前位置: 首页 > 图文教程 > 数据库 > MSSQL > PL/SQL开发中动态SQL的使用方法

MSSQL
SQL Server中容易混淆的数据类型
影响SQL Server性能的主要原因
浅谈SQL Server查询优化器中的JOIN算法
怎样缩小SQL Server数据库日志文件
SQL Server 2005最值得你升级的10个理由
SQL Server 商务智能特性对比
SQL Server 2005 SP1的新特性
怎样使用SQL Server来过滤数据
在SQL Server中处理空值时涉及的三个问题
怎样才能保护好 SQL Server 数据库
SQL SERVER数据库口令的脆弱性
SQL Server中的动态和静态内存分配
SQL存储过程学习:特殊的存储过程-触发器
几条常见的数据库分页 SQL 语句
SQL Server 2008服务器合并功能介绍
SQL Server数据库开发的二十一条军规
SQL Server 2008 的管理能力
快速删除重复记录,SQL Server如何实现?
将MySQL数据导入到Sql Server中
SQL Server和MySQL的安全性分析

MSSQL 中的 PL/SQL开发中动态SQL的使用方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 120 ::
收藏到网摘: n/a

 

  内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。本文通过几个实例来详细的讲解动态SQL的使用。  

  本文适宜读者范围:Oracle初级,中级

  系统环境:

   OS:windows 2000 Professional (英文版)

   Oracle:8.1.7.1.0

  正文:

  一般的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
(
    table_name in varchar2,     --表名
    field1 in varchar2,          --字段名
    datatype1 in varchar2,      --字段类型
    field2 in varchar2,          --字段名
    datatype2 in varchar2        --字段类型
) as
    str_sql varchar2(500);
begin
    str_sql:=’create table ’||table_name||’(’||field1||’ ’||datatype1||’,’||field2||’ ’||datatype2||’)’;
    execute immediate str_sql;   --动态执行DDL语句
    exception
        when others then
            null;
end ;

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

  SQL> execute proc_test(’dinya_test’,’id’,’number(8) not null’,’name’,’varchar2(100)’);

PL/SQL procedure successfully completed

SQL> desc dinya_test;
Name Type          Nullable Default Comments
---- ------------- -------- ------- --------
ID   NUMBER(8)

NAME VARCHAR2(100) Y

SQL>

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

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

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

create or replace procedure proc_insert
(
    id in number,                                 --输入序号
    name in varchar2                             --输入姓名
) as
    str_sql varchar2(500);
begin
    str_sql:=’insert into dinya_test values(:1,:2)’;
    execute immediate str_sql using id,name; --动态执行插入操作
    exception
        when others then
            null;
end ;

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

  SQL> execute proc_insert(1,’dinya’);
PL/SQL procedure successfully completed
SQL> select * from dinya_test;