在PL/SQL中使用SQL,动态SQL语句

** 在 ** ** PL/SQL ** ** 中使用 ** ** SQL

**

** 1. SQL ** ** 语句的分类 ** **

**

SQL 语句可以五类:

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

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

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

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

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

类别

|

SQL 语句范例

---|---

数据操纵语言( DML )

|

SELECT 、 INSERT 、 UPDATE 、 DELETE 、 EXPLAIN PLAN

数据定义语言( DDL )

|

DROP 、 CREATE 、 ALTER 、 GRANT 、 REVOKE

事务控制

|

COMMIT 、 ROLLBACK 、 SAVEPOINT 、 SET TRANSACTION

会话控制

|

ALTER SESSION 、 SET 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;

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus