久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

DMSQL WITH FUNCTION子句怎么使用

155次閱讀
沒有評論

共計 3749 個字符,預計需要花費 10 分鐘才能閱讀完成。

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

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 子句怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-17發表,共計3749字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 得荣县| 疏勒县| 乌兰县| 托里县| 宜城市| 蚌埠市| 桂阳县| 商城县| 汝阳县| 卓尼县| 平邑县| 镇雄县| 嫩江县| 宝鸡市| 上林县| 炉霍县| 永寿县| 白玉县| 洛川县| 肥城市| 泰来县| 伊宁市| 武义县| 曲麻莱县| 麦盖提县| 南江县| 上蔡县| 博野县| 石狮市| 大洼县| 木兰县| 临西县| 内乡县| 梨树县| 娱乐| 苍梧县| 遂平县| 桐梓县| 留坝县| 丹棱县| 定南县|