SQL中一些函数调用秘密

来源:互联网 发布:金域名都公寓出售 编辑:程序博客网 时间:2024/06/05 18:02

SQL中如果你调用了函数, 则你在某些特殊情况下, 需要注意函数的调用次数.
通常是在函数对于同一个输入参数, 但是却会返回不同的返回值的情况下需要注意.
之前的一个小小题目: http://www.itpub.net/thread-1051229-1-1.html
请通过该主题了解本帖即将讨论的内容.此贴内容:

QUOTE:
已知表 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列表中, 将会执行多次.

原创粉丝点击