中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > 数据库综合
在PL/SQL中使用SQL,动态SQL语句
作者:未知 时间:2005-07-27 23:41 出处:CSDN 责编:chinaitpower
              摘要:在PL/SQL中使用SQL,动态SQL语句

PL/SQL中使用 SQL

1. SQL语句的分类

SQL语句可以五类:

数据操纵语言(DML):用来改变表中已有的数据或者查询数据库表中的数据,但是不会改变表,或者其他对象的结构。

数据定义语言(DDL):用来创建、删除或者改变某数据模式对象的结构。更改数据模式对象的权限命令也是DDL

事务控制语句:将SQL语句组织成逻辑事务,事务中的语句作为一个整体执行,或者全部成功或者全部失败。这保证了数据的一致性。

会话控制语句:会改变单个数据库会话的设置——例如,启用SQL跟踪或启动一个事件。

系统控制语句:会改变整个数据库的设置——例如,启用或禁用存档。

类别

SQL语句范例

数据操纵语言(DML

SELECTINSERTUPDATEDELETEEXPLAIN PLAN

数据定义语言(DDL

DROPCREATEALTERGRANTREVOKE

事务控制

COMMITROLLBACKSAVEPOINTSET TRANSACTION

会话控制

ALTER SESSIONSET ROLE

系统控制

ALTER SYSTEM

2. PL/SQL中使用 SQL

       PL/SQL中可以直接使用的SQL语句只有DML和事务控制语句,(EXPLAIN PLAIN 尽管属于DML,但使用他也是非法的)要使用DDL语句的话,必须使用动态SQL

为什么会这样?我们先看一下PL/SQL的设计方法。

2.1 PL/SQL的设计方法——早邦定

       大家知道,程序设计语言按照两种方式邦定变量——早期邦定和后期邦定。邦定变量是识别程序中标示符存储位置的过程。PL/SQL中还包括检查数据库得到访问引用对象的权限(即在编译期间确定对象的权限,并与其标示符相邦定)

       PL/SQL在设计时特别采用了早期邦定。这样,一个语句块的执行将尽变快,因为所有的数据库对象在运行前都已经被编译器所确定。这样设计的结果是,DDL语句被禁止使用了。因为DDL语句会修改数据库对象,而数据库对象的权限是在编译期间决定的。

       下面举例子说明:

       BEGIN

              CREATE TABLE temp_table(

                     num_value NUMBER,

                     char_value CHAR(10);

              INSERT INTO temp_table(num_value,char_value) values (10,’HELLO’);

       END;

       在编译这个语句块时,temp_table标示符必须是邦定过的。于是这个过程将检查该表是否存在,但是该表在被运行之前是不会存在的。所以编译通不过,因为该语句块不能被编译,所以他也不可能运行。

2.2 使用动态SQL语句

       这样,要在PL/SQL中使用DDL语句,就必须使用动态SQL语句。什么是动态SQL语句?

       动态SQL语句允许你在运行时动态生成SQL语句,然后对其进行分析并执行。因为语句在运行之前并位创建出来,所以PL/SQL编译器不必邦定语句中的标示符,这样整个语句就可以通过编译。

       例如上面的例子:

       BEGIN

              EXECUTE IMMEDIATE ‘CREATE TABLE temp_table(

                     num_value NUMBER,

                     char_value CHAR(10)’;

              EXECUTE IMMEDIATE ‘INSERT INTO temp_table(num_value,char_value) values (10,’HELLO’)’;

       END;

 


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有