共计 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 小编会继续努力为大家带来更多实用的文章!