不包含INTO的動態SQL不會增加序列值
今天在試圖增加序列的NEXTVAL的時候,無意中發現了這個問題。
首先還是看看現象:
SQL> CREATE SEQUENCE SEQ_TEST;
序列已建立。
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
NEXTVAL
----------
1
SQL> BEGIN
2 FOR I IN 1..1000 LOOP
3 EXECUTE IMMEDIATE 'SELECT SEQ_TEST.NEXTVAL FROM DUAL';
4 END LOOP;
5 END;
6 /
PL/SQL 過程已成功完成。
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
NEXTVAL
----------
2
可以看到,序列SEQ_TEST的NEXTVAL並不像想象中的提高了1000,而給人的感覺似乎根本沒有執行。
避免的方法也簡單,只需要新增INTO語句:
SQL> DECLARE
2 TYPE T_ID IS TABLE OF NUMBER;
3 V_ID T_ID;
4 BEGIN
5 FOR I IN 1..1000 LOOP
6 EXECUTE IMMEDIATE 'SELECT SEQ_TEST.NEXTVAL FROM DUAL'
7 BULK COLLECT INTO V_ID;
8 END LOOP;
9 END;
10 /
PL/SQL 過程已成功完成。
SQL> SELECT SEQ_TEST.NEXTVAL FROM DUAL;
NEXTVAL
----------
1003
產生這種情況有兩種可能,一是由於Oracle發現動態SQL的執行沒有INTO語句,不需要返回結果,因此根本沒有執行;二是Oracle只是開啟遊標,並沒有FETCH資料,因此造成了序列的值沒有發生變化。
最後透過一個測試檢驗一下,到底是哪種情況造成了上面的現象:
SQL> CREATE OR REPLACE FUNCTION F_TEST RETURN NUMBER AS
2 BEGIN
3 DBMS_LOCK.SLEEP(10);
4 RETURN 0;
5 END;
6 /
函式已建立。
SQL> SET TIMING ON
SQL> BEGIN
2 EXECUTE IMMEDIATE 'SELECT F_TEST FROM DUAL';
3 END;
4 /
PL/SQL 過程已成功完成。
已用時間: 00: 00: 00.10
SQL> DECLARE
2 V_ID NUMBER;
3 BEGIN
4 EXECUTE IMMEDIATE 'SELECT F_TEST FROM DUAL' INTO V_ID;
5 END;
6 /
PL/SQL 過程已成功完成。
已用時間: 00: 00: 10.29
透過對比就可以發現,如果缺少INTO語句,那麼動態SQL就不會執行。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-429624/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL SERVER的記憶體會不斷增加,問題分析(轉)SQLServer記憶體
- 動態代理會不會被ASM,Instrument取代?ASM
- oracle增加主鍵也不會了Oracle
- oracle下批量增加序列值Oracle
- 經典問題 2 —— 動態不包含區間與點完美匹配問題
- 堅持“動態清零”總方針不猶豫不動搖
- 堅持“動態清零”不動搖
- 不會git的程式設計師,會不會被鄙視?Git程式設計師
- 管理層做好任務管理,團隊不會帶不動
- 為什麼說會不會SQL,決定著你的工資?方向不對,努力也白費!SQL
- 不學無數——Java動態代理Java
- GAT專案新需求:車輛基本資訊查詢增加勾選不包含下級
- 判斷字串中只包含或不包含某種字元的方法字串字元
- SQL語句為什麼不會共享(上)SQL
- SQL語句為什麼不會共享(中)SQL
- SQL語句為什麼不會共享(下)SQL
- 【學習筆記】不會吧不會吧,不會有人還在手寫堆吧筆記
- 匹配不包含字母的字串的正規表示式字串
- 不會吧不會吧,還有開發不會Java填充PDF模板資料的,趕緊看看吧Java
- Redis鍵不會自動過期 - AblyRedis
- 移動應用必定不會長久
- NV驅動重灌不會影響CUDA
- 遊學唯品會—移動事業部UED團隊的不驕不躁
- SQL server 動態SQL對變數講行賦值SQLServer變數賦值
- MYSQL——mysql檢索不包含字母U的資料MySql
- .Net Core利用反射動態載入類庫的方法(解決類庫不包含Nuget依賴包的問題)反射
- mysql如何判斷不包含某個字元MySql字元
- dba_objects 中不包含 constraintObjectAI
- oracle 自動列值增加Oracle
- 關於動態使用keepAlive不生效的問題
- mssql sqlserver 表增加列後,檢視不會自動更新相關列的兩種解決方法分享SQLServer
- win10增加啟動項不啟動怎麼辦 win10系統新增啟動項不啟動解決方法Win10
- SVG動態繪製不規則圖形SVG
- 最大值減不為0的最小值
- Oracle重置序列(不刪除重建方式)Oracle
- 沒想到,JDBC 驅動會偷偷修改 sql_mode 的會話值JDBCSQL會話
- 改寫不走索引的SQL索引SQL
- javascript 的問題 ,不知你會不會。JavaScript