尝试理解函数以及为什么它会给出这个结果

时间:2017-03-25 20:10:56

标签: sql oracle plsql oracle11g

有人写了(他离开公司)以下功能:

Create function code_status
( p_code_id varchar, 
  p_daytime date, 
  p_status varchar);

  Select status into l_value from table1 where code_id=p_code_id and daytime=p_daytime;

  Return l_value;
  End;

并在下面的SQL查询中使用它:

Select code, daytime, status, code_status(code_id, daytime, status) from  table2 
where code_status(code_id, daytime, status) in ('act') and daytime = '12 Jan 2017'

当我从函数运行select查询以获取code ='f23'

的所有行时
Select code, code_id, daytime, status from table1 where code = 'f23';

它给出了以下结果:

Code   code_id  status   daytime
F23    123df     act     16 Jul 2016
F23    123df     stn     12 Jan 2017
F23    123df     act     15 Mar 2017

当我在下面运行查询时,会得到以下结果:

Select code, daytime, code_id,status, code_status(code_id, daytime, status)  stat_funct 
from table2 
where code_status(code_id, daytime, status) in ('act') 
  and daytime = '12 Jan 2017' 
  and code='f23' 
 
Code   daytime      code_id   status    stat_funct 
F23    12 Jan 2017   123df     act      act   

现在我想了解这个函数的作用以及它在查询中的工作原理,为什么stat_funct是'act'?

1 个答案:

答案 0 :(得分:0)

它使用提供的参数抽象status table2 {{1}}字段的访问权限并命名为" code_status"。 table1和table2具有相似模式的事实是巧合的,但它确实意味着函数可以用连接替换(这会更好地执行)。

创建它的原因可能是为了更容易在简单查询中使用(避免连接),或出于安全原因(所有数据访问都是通过SP进行的,并且通过授予对SP的访问权限来处理安全性)而不是表 - 恕我直言,反模式。)