在 PL/ SQL 中使用 SQL 1. SQL 語句的分類 SQL 語句可以五類: 數據操縱語言( DML ):用來改變表中已有的數據或者查詢 數據" name="description" />
MILY: 宋體; mso-ascii-font-family: "Times New Roman"; mso-hansi-font-family: "Times New Roman"; mso-bidi-font-size: 10.5pt">在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;