中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

DMSQL WITH FUNCTION子句怎么使用

發布時間:2021-12-21 17:18:12 來源:億速云 閱讀:124 作者:iii 欄目:數據庫

這篇文章主要介紹“DMSQL WITH FUNCTION子句怎么使用”,在日常操作中,相信很多人在DMSQL WITH FUNCTION子句怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”DMSQL WITH FUNCTION子句怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

WITH FUNCTION子句
WITH FUNCTION子句用于在SQL語句中臨時聲明并定義存儲函數,這些存儲函數可以在其作用域內被引用。相比模式對象中的存儲函數,通過WITH FUNCTION定義的存儲函數在對象名解析時擁有更高的優先級。和公用表表達式CTE類似,WITH FUNCTION定義的存儲函數對象也不會存儲到系統表中,且只在當前SQL語句內有效。

WITH FUNCTION子句適用于偶爾需要使用存儲過程的場景。和模式對象中的存儲函數相比,它可以清楚地看到函數定義并避免了DDL操作帶來的開銷。

語法格式
WITH < 函數> {< 函數>}
參數
1.< 函數> 語法遵照《DMSQL程序設計》中存儲過程的語法規則。
語句功能
供用戶定義同一語句內臨時使用的存儲函數。
使用說明
1.中定義的函數的作用域為所在的查詢表達式內;
2.同一中函數名不得重復;
3. 中定義的函數不能是外部函數。

該語句的使用者并不需要CREATE PROCEDURE數據庫權限。

舉例說明
例如WITH FUNCTION中定義的函數優先級高于模式對象的例子。

SQL> WITH FUNCTION f1(C INT) RETURN INT AS BEGIN RETURN C * 10; END;
2   SELECT f1(5236) FROM DUAL;
3   /
LINEID     F1(5236)   
---------- -----------
1          52360
used time: 1.352(ms). Execute id is 34061.

例如WITH FUNCTION和公用表表達式混合的例子。

SQL> WITH FUNCTION f21(C1 INT) RETURN INT AS BEGIN RETURN C1; END;
2   SELECT f21(1) FROM dual WHERE 100 IN
3   (
4   WITH FUNCTION f22(C1 INT) RETURN INT AS BEGIN RETURN C1 + 2; END;
5   FUNCTION f23(C1 INT) RETURN INT AS BEGIN RETURN C1 - 2; END;
6   v21(C) AS (SELECT 50 FROM dual)
7   SELECT f22(C) +f23(C) FROM v21
8   );
9   /
LINEID     F21(1)     
---------- -----------
1          1
used time: 12.313(ms). Execute id is 34092.

公用表表達式子句
嵌套SQL語句如果層次過多,會使SQL語句難以閱讀和維護。如果將子查詢放在臨時表中,會使SQL語句更容易維護,但同時也增加了額外的I/O開銷,因此,臨時表并不太適合數據量大且頻繁查詢的情況。為此,在DM7中引入了公用表表達式(CTE,COMMON TABLE EXPRESSION),使用CTE可以提高SQL語句的可維護性,同時CTE要比臨時表的效率高很多。CTE 與派生表類似,具體表現在不存儲為對象,并且只在查詢期間有效。與派生表的不同之處在于,CTE 可自引用,還可在同一查詢中引用多次。

WITH AS短語,也叫做子查詢部分(SUBQUERY FACTORING),它定義一個SQL片斷,該SQL片斷會被整個SQL語句所用到。它可以有效提高SQL語句的可讀性,也可以用在UNION ALL的不同部分,作為提供數據的部分。

公用表表達式的作用
公用表表達式(CTE)是一個在查詢中定義的臨時命名結果集,將在FROM子句中使用它。每個CTE僅被定義一次(但在其作用域內可以被引用任意次),并且在該查詢生存期間將一直生存,而且可以使用CTE來執行遞歸操作。

因為UNION ALL的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用WITH AS短語,則只要執行一遍即可。如果WITH AS短語所定義的表名被調用兩次以上,則優化器會自動將WITH AS短語所獲取的數據放入一個臨時表里,如果只是被調用一次則不會,很多查詢通過這種方法都可以提高速度。

公用表表達式的使用
語法格式
WITH < 公用表表達式子句>{, < 公用表表達式子句>}
< 公用表表達式子句>::=< 公用表表達式名[ ( <列名>{,< 列名>} ) ] AS ( 公用表表達式子查詢語句)>
參數
1.< 公用表表達式名> 公用表表達式的有效標識符;
2.< 列名> 指明被創建的公用表表達式中列的名稱;
3.< 公用表表達式子查詢語句> 標識公用表表達式所基于的表的行和列,其語法遵照SELECT語句的語法規則。

語句功能
供用戶定義公用表表達式,也就是WITH AS語句。
使用說明
1.< 公用表表達式名>必須與在同一WITH子句中定義的任何其他公用表表達式的名稱不同,但公用表表達式名可以與基表或基視圖的名稱相同。在查詢中對公用表表達式名的任何引用都會使用公用表表達式,而不使用基對象;
2.< 列名>在一個CTE 定義中不允許出現重復的列名。指定的列名數必須與< 公用表表達式子查詢語句>結果集中列數匹配。只有在查詢定義中為所有結果列都提供了不同的名稱時,列名稱列表才是可選的;
3.< 公用表表達式子查詢語句>指定一個結果集填充公用表表達式的SELECT 語句。除了CTE不能定義另一個CTE 以外,< 公用表表達式子查詢語句> 的SELECT 語句必須滿足與創建視圖時相同的要求;
4.公用表表達式后面必須直接跟使用CTE的SQL語句,否則無效。
該語句的使用者必須對< 查詢說明>中的每個表均具有SELECT權限。

舉例說明
公用表表達式可以認為是在單個SELECT、INSERT、UPDATE、DELETE 或CREATE VIEW 語句的執行范圍內定義的臨時結果集。
例如創建一個表TEST1和表TEST2,并利用公用表表達式對它們進行連接運算。

SQL> CREATE TABLE TEST1(I INT);
executed successfully
used time: 17.257(ms). Execute id is 34224.
SQL> INSERT INTO TEST1 VALUES(1);
affect rows 1
used time: 1.008(ms). Execute id is 34226.
SQL> INSERT INTO TEST1 VALUES(2);
affect rows 1
used time: 0.712(ms). Execute id is 34227.
SQL> CREATE TABLE TEST2(J INT);
executed successfully
used time: 42.221(ms). Execute id is 34229.
SQL> INSERT INTO TEST2 VALUES(5);
affect rows 1
used time: 1.104(ms). Execute id is 34230.
SQL> INSERT INTO TEST2 VALUES(6);
affect rows 1
used time: 0.696(ms). Execute id is 34232.
SQL> INSERT INTO TEST2 VALUES(7);
affect rows 1
used time: 0.664(ms). Execute id is 34234.
SQL> WITH CTE1(K) AS(SELECT I FROM TEST1 WHERE I > 1),
2   CTE2(G) AS(SELECT J FROM TEST2 WHERE J > 5)
3   SELECT K, G FROM CTE1, CTE2;
LINEID     K           G          
---------- ----------- -----------
1          2           6
2          2           7
used time: 1.692(ms). Execute id is 34237.

例如利用公用表表達式將表TEST1中的記錄插入到TEST2表中。

SQL> INSERT INTO TEST2 WITH CTE1 AS(SELECT * FROM TEST1)
2   SELECT * FROM CTE1;
affect rows 2
used time: 1.048(ms). Execute id is 34247.
SQL> SELECT * FROM TEST2;
LINEID     J          
---------- -----------
1          5
2          6
3          7
4          1
5          2
used time: 1.135(ms). Execute id is 34249.

到此,關于“DMSQL WITH FUNCTION子句怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大埔区| 昌黎县| 苍梧县| 巴彦淖尔市| 游戏| 陆河县| 漯河市| 鹿泉市| 梅州市| 漾濞| 额尔古纳市| 桃园市| 东辽县| 玉环县| 武汉市| 滨州市| 江阴市| 南通市| 富裕县| 温州市| 岢岚县| 教育| 区。| 昭觉县| 万州区| 建湖县| 离岛区| 湘潭市| 嘉义县| 濮阳县| 吴桥县| 古丈县| 塘沽区| 双辽市| 淮安市| 德保县| 家居| 长春市| 普宁市| 宜兰市| 象山县|