【DB筆試面試464】動態SQL是什麼?

  • 2019 年 10 月 11 日
  • 筆記

題目部分

動態SQL是什麼?

答案部分

在PL/SQL開發過程中,使用SQL或PL/SQL可以實現大部分的需求,但是,在某些特殊的情況下,在PL/SQL中使用標準的SQL語句或DML語句不能實現自己的需求,例如需要動態建表或執行某個不確定的操作的時候,就需要動態執行,還有DDL語句及系統控制語句都不能在PL/SQL中直接使用,這就需要使用動態SQL來實現。因此,在Oracle數據庫開發PL/SQL塊中,可以把SQL分為靜態SQL和動態SQL。所謂靜態SQL指的是在PL/SQL塊中使用的SQL語句在編譯時是明確的,執行的是確定對象。動態SQL是指在PL/SQL塊編譯時SQL語句是不確定的,如根據用戶輸入的參數的不同而執行不同的操作。編譯程序對動態語句部分不進行處理,只是在程序運行時動態地創建語句、對語句進行語法分析並執行該語句。動態SQL允許在SQL客戶模塊或嵌入式宿主程序的執行過程中執行動態生成的SQL語句,動態SQL語句在程序編譯時尚未確定。其中,有些部分需要在程序的執行過程中臨時生成的SQL語句,SQL標準引入動態SQL的原因是由於靜態SQL不能提供足夠的編程靈活性。

動態SQL是使用EXECUTE IMMEDIATE語句來實現的。下面給出一個使用動態SQL的例子。

需求:完成一個存儲過程,根據用戶輸入的表名及字段名等參數動態創建表。

SQL> SELECT * FROM LHR_TB_0427; SELECT * FROM LHR_TB_0427 * ERROR at line 1: ORA-00942: table or view does not exist SQL> CREATE OR REPLACE PROCEDURE PROC_TEST(TABLE_NAME IN VARCHAR2, –表名 2 FIELD1 IN VARCHAR2, –字段名 3 DATATYPE1 IN VARCHAR2, –字段類型 4 FIELD2 IN VARCHAR2, –字段名 5 DATATYPE2 IN VARCHAR2 –字段類型 6 ) 7 AUTHID CURRENT_USER AS 8 STR_SQL VARCHAR2(500); 9 BEGIN 10 STR_SQL := 'CREATE TABLE ' || TABLE_NAME || '(' || FIELD1 || ' ' || 11 DATATYPE1 || ',' || FIELD2 || ' ' || DATATYPE2 || ')'; 12 EXECUTE IMMEDIATE STR_SQL; –動態執行DDL語句,注意這裡的STR_SQL變量的最後不能有分號 13 END; 14 /

Procedure created.

SQL> EXEC PROC_TEST('LHR_TB_0427','ID','NUMBER(8) NOT NULL','NAME','VARCHAR2(100)');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM LHR_TB_0427;

no rows selected

本文選自《Oracle程序員面試筆試寶典》,作者:李華榮。

About Me:小麥苗

● 本文作者:小麥苗,只專註於數據庫的技術,更注重技術的運用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

● 本系列題目來源於作者的學習筆記,部分整理自網絡,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

● 題目解答若有不當之處,還望各位朋友批評指正,共同進步