存储过程和UDF的Oracle vs SQL Server

时间:2012-06-12 19:02:32

标签: sql-server oracle function

首先感谢您提供的任何帮助。我是一个完整的SQL Server新手,在过去的20年里一直专注于Oracle和PL / SQL。

我可以指出的任何相关文件都会很棒,因为我目前的消息来源尚未提供答案!

以下是否正确:Oracle Function = SQL Server用户定义函数                        Oracle Procedure = SQL Server SPROC?

我简化的Oracle示例:

select student_id
       ,someschema.f_get_accommadation_get(student_id) accommodation 
from   students;

其中someschema.someschema.f_get_accommadation_get(student_id)是:

create or replace function someschema.f_get_accommadation_get(p_student_id in number)
return varchar2 is
local_sped number;

begin
  select sped_cd from someschema.student_sped 
  into local_sped
  where student_id = p_student_id;

  if local_sped = 1 then return('A')
    elsif local_sped = 2 then return('B')
       else        return('C')
    end if;
  end if;
exception when others then return(null);
end;

我可以将Oracle函数重新创建为UDF,将begin ... exception ... end转换为开始尝试并开始捕获吗?

如果没有,我的其他策略是什么?

再次感谢

1 个答案:

答案 0 :(得分:1)

你基本上是对的。但是,该函数将像SQL Server中的绝对狗一样执行。我不确定它在Oracle中是否更好,但我当然试图避免使用标量函数。对于一般的函数,最好使用内联表函数(second example on this page),然后使用CROSS APPLY获取值。

但是,在这种情况下,我几乎肯定会将其重构为LEFT OUTER JOIN,并带有CASE语句(see here)。

这看起来像是:

select student_id,
       CASE spec_cd WHEN 1 THEN 'A'
                    WHEN 2 THEN 'B'
                    WHEN 3 THEN 'C'
                    ELSE NULL END as ColumnName
from   students s left outer join 
       someschema.student_sped ss 
    on ss.student_id = s.student_id