SQL中如果你调用了函数, 则你在某些特殊情况下, 需要注意函数的调用次数.
通常是在函数对于同一个输入参数, 但是却会返回不同的返回值的情况下需要注意.
之前的一个小小题目: http://www.itpub.net/thread-1051229-1-1.html
请通过该主题了解本帖即将讨论的内容.此贴内容:
已知表 t ,执行 select count(*) from t; 返回值 3;
那么以下这个SQL语句的返回值可能的结果有几个(不是指返回值是多少,而是问可能有几种值)?
也就是执行以下SQL无限多次, 其返回的结果有几个不同的值?
select count(*) from t
where dbms_random.value < dbms_random.value;
A. 1 种 B. 2 种 C. 3 种 D. 4 种
答案选择 B.2种, 结果值只有0 和 3.
我们首先创建一个Package, 可以通过它了解函数的调用情况.
create or replace package pkg
is
function get_n return number;
function inc_n return number;
procedure reset_n;
end;
/
create or replace package body pkg
is
g_n number;
function get_n return number
is
begin
return g_n;
end;
function inc_n return number
is
begin
g_n := g_n + 1;
return g_n;
end;
procedure reset_n
is
begin
g_n := 0;
end;
begin
g_n := 0;
end;
/
我们再创建一个测试表:
create table t(id number);
insert into t values(1);
insert into t values(2);
insert into t values(3);
commit;
至此, 我们开始SQL中的函数调用调研.
1.
SQL> exec pkg.reset_n;
PL/SQL procedure successfully completed
SQL> select pkg.inc_n,pkg.inc_n from t;
INC_N INC_N
---------- ----------
1 2
3 4
5 6
SQL> select pkg.inc_n,pkg.inc_n from t where id = 2;
INC_N INC_N
---------- ----------
1 2
我们可以看到出现在select列上的函数调用对于返回的每一行记录都会调用一次, 而如果多次出现在select列表中, 将会执行多次.