[20180531]函数调用与递归.txt

简介: [20180531]函数调用与递归.txt --//前几天我发现开发把一个计算公式建立为函数,我本想这样不好,因为执行select f(x)...,的每行都会调用自定义的函数.
[20180531]函数调用与递归.txt

--//前几天我发现开发把一个计算公式建立为函数,我本想这样不好,因为执行select f(x)...,的每行都会调用自定义的函数.
--//我本以为这样会产生大量的递规调用.但是还是有点吃惊,如果函数里面没有一些select语句,这样的调用自定义函数,不会
--//产生递规,当然我个人这样还是不提倡这样的方式.

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

grant execute on sys.dbms_lock to scott;

CREATE OR REPLACE FUNCTION sleep (seconds IN NUMBER)
RETURN NUMBER AS
BEGIN
--//  sys.dbms_lock.sleep(seconds);
  RETURN seconds;
END;
/

2.测试1:
set autot traceonly
select rowid,dept.*,sleep(1) from dept ;
set autot off

SCOTT@test01p> select rowid,dept.*,sleep(1) from dept ;
Execution Plan
---------------------------
Plan hash value: 3383998547
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     4 |    80 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DEPT |     4 |    80 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1021  bytes sent via SQL*Net to client
        544  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed
--//可以发现没有递归,如果第一次存在递归,多执行计划在查看.(以下测试采用相似的方式).

SCOTT@test01p> set autot off

3.测试2:
--//如果修改如下:
CREATE OR REPLACE FUNCTION sleep (seconds IN NUMBER)
RETURN NUMBER AS
BEGIN
  sys.dbms_lock.sleep(seconds);
  RETURN seconds;
END;
/

set autot traceonly
select rowid,dept.*,sleep(1) from dept ;
set autot off

SCOTT@test01p> select rowid,dept.*,sleep(1) from dept ;
Execution Plan
----------------------------------------------------------
Plan hash value: 3383998547
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     4 |    80 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DEPT |     4 |    80 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1021  bytes sent via SQL*Net to client
        544  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed
--//可以发现调用sys.dbms_lock.sleep也没有出现递归.


4.测试3:
--//如果修改如下:
CREATE OR REPLACE FUNCTION sleep (seconds IN NUMBER)
RETURN NUMBER
is
d_date date;
BEGIN
  select sysdate into d_date from dual;
  RETURN seconds;
END;
/

set autot traceonly
select rowid,dept.*,sleep(1) from dept ;
set autot off

SCOTT@test01p> select rowid,dept.*,sleep(1) from dept ;
Execution Plan
----------------------------------------------------------
Plan hash value: 3383998547
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     4 |    80 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DEPT |     4 |    80 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          4  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1021  bytes sent via SQL*Net to client
        544  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed

--//可以发现只有在函数里面执行sql语句,才存在递归调用.

目录
相关文章
|
4天前
函数
一个源程序由多个函数组成。 C程序的执行从main()函数开始; 所有函数都是平行的; 函数分类;可以分为标准函数和自定义函数,还可以分为有参函数和无参函数。
|
2月前
|
Shell PHP
escapeshellarg() 函数
escapeshellarg() 函数
|
6月前
|
存储 编译器 C++
|
5月前
|
算法 Java 开发者
解密CollectGarbage函数
解密CollectGarbage函数
|
5月前
|
C++
<iomanip>库中setw(),setfill()等函数的使用
<iomanip>库中setw(),setfill()等函数的使用
123 0
|
6月前
|
XML 存储 JavaScript
loadXMLString() 函数
`loadXMLString()` 是一个JavaScript函数,用于在不同浏览器环境下解析XML字符串。它使用DOMParser在支持的浏览器中解析,而在IE中则使用ActiveXObject。函数接受XML文本作为参数,返回解析后的XML文档。此函数适用于HTML页面的<script>标签内,方便在页面中重用,尤其在处理XML实例时。
|
11月前
|
机器学习/深度学习
函数的使用
任务1 统计小组一门课程的总分及平均分。
59 1
|
11月前
|
编译器 C语言
对函数的剖析一
对函数的剖析一
38 0
|
算法 程序员 C++
C/C++ 中的 strrchr() 函数
strrchr() 函数 在 C++ 中,strrchr() 是用于字符串处理的预定义函数。cstring 是字符串函数所需的头文件
317 0
|
程序员 C语言