一般的PL/SQL程序設計中,在DML和事務控制的語句中可以直接使用SQL,但是對于新建存儲過程,其中涉及傳參要被應用為列名時,不能在PL/SQL中直接使用,一會兒下面舉例介紹,那么要想實現設計的功能,可以通過使用動態SQL來實現。
首先我們應該了解什么是動態SQL,在Oracle數據庫開發PL/SQL塊中我們使用的SQL分為:靜態SQL語句和動態SQL語句。所謂靜態SQL指在PL/SQL塊中使用的SQL語句在編譯時是明確的,執行的是確定對象。而動態SQL是指在PL/SQL塊編譯時SQL語句是不確定的,如根據用戶輸入的參數的不同而執行不同的操作。編譯程序對動態語句部分不進行處理,只是在程序運行時動態地創建語句、對語句進行語法分析并執行該語句。
Oracle中動態SQL可以通過本地動態SQL來執行,也可以通過DBMS_SQL包來執行。本篇文章我們只介紹本地動態執行sql:
oracle 12版本以上適用:
動態sql
drop package su1;create or replace package su as? function get_id() return varchar2;end su;/create or replace package body su1 as? function get_id() return varchar2? as? str_sql varchar2(200);? b varchar2(200);? begin? str_sql := 'select * from b1';? execute immediate str_sql into b;? return b;? end;end su1;/select su1.get_id() from dual;create or replace package su as? function get_id(tabname in varchar2) return varchar2;end su;/create or replace package body su1 as? function get_id(tabname in varchar2) return varchar2? as? str_sql varchar2(200);? b varchar2(200);? begin? str_sql := 'select * from '||tabname||'';? execute immediate str_sql into b; --注意這里僅有一行數據返回? return b;? end;end su1;/select su1.get_id(‘b1’) from dual;