1. 程式人生 > >Oracle 過程中執行動態 SQL 或 DDL 語句

Oracle 過程中執行動態 SQL 或 DDL 語句

如果你用的是 Oracle 8i 及以上的版本,那簡單,在過程中用 execute immediate sql_str 就行, sql_str 是一個拼湊的 SQL 語句,但這個動態語句中帶引數,或 Select 的結果要 into 到變數中時就要稍加留心一下了。而在 8i 以前的版本(誰還用這麼古老的玩藝,總有些不得已的地方,老系統考慮升級成本遺留下來的,應用軟體所伴隨著的等),都沒法用 execute immediate,就得使用 DBMS_SQL 包來實現了

何謂動態 SQL 和 DDL 語句呢?通常在過程中要操作的表名、欄位名都必須是明確的,否則編譯過程時就要報錯,但如果這兩者也用變數名來表示就是動態的。DDL 就是資料庫物件定義的操作,如 CREATE TABLE/VIEW/INDEX/SYN/CLUSTER....,及這些物件的刪除、修改操作等等。

比如在 Oracle 中有執行下面過程塊的意圖時,就要使用到 execute immediate 或是 DBMS_SQL 包了。當然下面的語句塊是通不過的。

1 2 3 4 5 6 7 8 declare col_name varchar2(30) := 'name'; --假定表user存在name欄位 col_val  varchar2(30); begin select col_name into col_val --按照慣常思維,可能就會這麼寫 from
user where age between 18 and 25;   --編譯時會提示列名不存在的 drop table t2;  --不能直接執行 DDL 語句,後面查詢 t2 編譯器就無能為力了 end;

現在我們提出對上面問題的解,針對第一個 Select 語句來說明,並假設查詢中還帶有引數。塊中的 DDL 也是類似的解法。例子因力圖涵蓋更多內容,所以稍顯複雜,如果不需要 into (如 update/delete 語句),或者不帶引數,會簡單多了,應不難簡化。有兩種處理方法,以 8i  為分水嶺。

1. Oracle 8i 及以上版本的過程中處理動態 SQL 語句的辦法

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 declare v_col_name varchar2(30) := 'name'; --欄位名 name 用變數來表示 v_user_name  varchar2(30); --使用者名稱稱 v_user_age  integer;       --使用者年齡 v_sql_str  varchar2(500);  --動態 SQL 語句 begin v_sql_str := 'select '||v_col_name||',age from users --欄位名後面不能緊隨 into 到變量了 where age between :start_age and :end_age and rownum=1'; --兩個命名引數 --用 execute immediate 動態執行 SQL 語句 --注意其後的 into 欄位值到變數的寫法,還有 using 來代入引數 execute

相關推薦

Oracle 過程執行動態 SQL DDL 語句

如果你用的是 Oracle 8i 及以上的版本,那簡單,在過程中用 execute immediate sql_str 就行, sql_str 是一個拼湊的 SQL 語句,但這個動態語句中帶引數,或 Select 的結果要 into 到變數中時就要稍加留心一下了。而在

Oracle 儲存過程執行動態SQL動態表名

create or replace procedure mw_sys.clearrubbishdatefy2 is type table_type is table of mw_app.mwt_ud_yscsjdl.tablename%type; tablenameAr

存儲過程執行動態Sql語句

查詢 需要 一點 定義 data 復制 ast 我們 臨時   在最近的項目中,有用到動態執行sql語句,SQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXE

怎樣SQL存儲過程執行動態SQL語句

緩存 參數 insert 每次 一點 證明 record scac 清空緩存 MSSQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXEC沒有。還有一個最大的好

DB2 存儲過程執行動態SQL

values exec 退出 .... strong arch 包含 gin 使用 樣本代碼: DROP PROCEDURE QUOTATION.COPY_SAMPLE; CREATE PROCEDURE QUOTATION.COPY_SAMPLE ( IN tab

儲存過程執行動態Sql語句

  MSSQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出介面,而EXEC沒有。還有一個最大的好處就是利用sp_executesql,能夠重用執行計劃,這就大大提供了執

oracle儲存過程應用動態sql

需求背景:對有些資料庫操作較多的功能演算法需求,或使用應用程式程式碼多次連線操作資料,會造成較大效能損耗,或者系統動態引數化如要查詢的表名是存在資料庫裡的,為節減網路連線開銷,建議使用儲存過程實現資料庫操作需求的演算法。動態sql ,意思是sql語句並不是事先明確的,而是可

sqlserver在觸發器執行動態sql用到inserted(deleted)表

  這兩天公司產品中要加個資料同步用的觸發器,oracle版沒什麼問題,很順利的寫完了。       在寫sqlserver版時遇到了麻煩。由於在觸發器中要根據inserted(deleted)表的資料,對另一個表進行更新操作,而這個表的某些欄位是不固定的,所以需要寫成動態

在pl/sql執行動態sql

       動態sql就是把sql寫在一個字串裡,在儲存過程中解析字串執行sql。這種動態sql很多時候會在別的語言裡寫,再連線資料庫進行操作,這樣的確方便很多,例如在java中使用JDBC。但是如

MySQL儲存過程使用動態SQL與靜態SQL的區別

儲存過程中使用動態SQL 例項 [sql] view plain copy print? DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`t1`$$ CREATE /** [DEFINER

oracle儲存過程如何執行動態SQL語句

有時需要在oracle儲存過程中執行動態SQL語句 ,例如表名是動態的,或欄位是動態的,或查詢命令是動態的,可用下面的方法: set serveroutput ondeclare    n number;    sql_stmt varchar2(50);    t varc

Oracle 在函數存儲過程執行一條插入語句並返回主鍵ID值

num c# 如果 acl get col oracle style 建表語句 有時,我們需要往一張表插入一條記錄,同時返回主鍵ID值。 假定主鍵ID的值都是通過對應表的SEQUENCE來獲得,然後進行ID賦值 這裏有幾種情況需要註意: 1)如果建表語句含有主鍵ID的觸發器

sql server 儲存過程執行帶輸出引數的動態 sql

CREATEprocedure pUserList(    @UserTypechar(2),    @pagenumint,    @perpagesizeint,    @pagetotalint out,    @rowcountint out)as    set nocount on     DECL

Oracle VirtualBox 執行的虛擬機器匯入 VMware Fusion、Workstation Player

1、從virtualbox種匯出電腦為 .ova格式映象 要匯入 Oracle VirtualBox 中執行的虛擬機器,必須將該虛擬機器從 VirtualBox 匯出到開放虛擬化格式存檔( .ova  檔案), 然後再將此檔案匯入 VMware Fusion、Workstation 或

MySQL 儲存過程執行DDL

一、定期增加表分割槽 1、增加表分割槽例 CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `p_create_Partition`(IN databaseName VARCHAR(50),IN tableName VARCHAR(50))L_END:BEGIN&nb

mysql儲存過程迴圈遍歷sql結果集,並執行動態sql

/* 將其他幾張表資料複製到一張總表中 */ DROP PROCEDURE IF EXISTS sp_customer; CREATE PROCEDURE sp_customer() BEGIN -- 需要執行的SQL語句 DECLARE v_sql_1 VARCH

mysql儲存過程執行動態sql語句並返回值

Java程式碼 set @sql=’xxx’; prepare stmt from @sql; execute stmt; deallocate prepare stmt; select @curd1; set @sql=’xxx’; prepare stmt f

Oracle sqlplus執行SQL指令碼 Error SP2-0310

在SQLPLUS環境下,可以使用@path的方式來執行SQL指令碼 命令如下 @d:/oracle scripts/exec_scripts_test.sql 但是我嘗試了多次,最後都是這個錯誤 SP2-0310: unable to open file "/oracle.

監控並停止在DB2執行的程式SQL語句

監控資料庫XX中執行的程式 db2 'list applications for database DBName show detail' | grep yourIP --color=AUTO “show detail”可以省略,這樣只列出非詳細資訊。後面替換成你自己的IP,

mysql 儲存過程 執行動態sql

使用mysql的儲存過程執行動態sql語句 delimiter // create procedure proce2(in old varchar(100), in newT varchar(1