返回数据集的Oracle存储过程

时间:2016-04-25 19:57:33

标签: asp.net oracle stored-procedures oracle11g

我是Microsoft堆栈(C#,SQL Server,EF等)上的开发人员,该开发人员继承了连接到Oracle 11g数据库的webforms应用程序。该应用程序目前充满了内联SQL语句,我想将其转换为参数化存储过程。然而,习惯于T-SQL,我发现转向PL / SQL是一个相当陡峭的学习曲线。

大多数SQL语句都是相当简单的语句,它们从基表中返回过滤后的数据集

select field1, field2, fieldn 
from foo 
where field1 = 'blah'

在T-SQL中,这将是相当简单的

create procedure fooproc
  @filter varchar(100)
as
begin
    select field1, field2, field3 
    from foo 
    where field1 = @filter
end

不幸的是,它在PL / SQL中似乎并不那么简单。搜索后,我找到了答案,其中包括:

  1. 使用函数而不是过程(这让我想知道SQL Server中的过程是否与Oracle中的过程一对一映射)
  2. 为程序创建一个“包”(仍然不太确定它是什么)
  3. 使用游标或for循环(这似乎是邪恶的,只是错误的)
  4. 此外,我在网上找到的Oracle存储过程的大部分示例都会返回标量值或根本没有值。我认为这是一项相当普遍的任务,很多人都希望这样做,但是我的google-fu在这一方面肯定不是很强大。所以如果有人能帮我翻译,我会很感激。

    由于

1 个答案:

答案 0 :(得分:0)

只返回结果集的SQL Server存储过程最自然地转换为返回游标的Oracle存储函数。像

这样的东西
CREATE OR REPLACE FUNCTION fooFunc( p_field1 IN foo.field1%type )
  RETURN sys_refcursor
IS
  l_rc sys_refcursor;
BEGIN
  OPEN l_rc
   FOR SELECT field1, field2, field3
         FROM foo
        WHERE field1 = p_field1;
  RETURN l_rc;
END;

在Oracle 12.1中,通过允许过程隐式返回ref游标,有一些syntactic sugar for implicit results可以更轻松地从SQL Server进行转换,但是您的问题表明您仍然使用11g,因此可能不是一个选项。

您还可以拥有类型为out的{​​{1}}参数的过程。但是,通常情况下,您应该为仅返回修改数据的对象的结果和过程的对象使用函数。

通常,所有Oracle过程和函数都将被包装到将相关功能部分组合在一起的包中。如果您有六个函数可以让您使用不同的条件查询sys_refcursor,那么您需要将所有这些函数放在一个包中,以保持组织有序。