2016-04-25 36 views
1

我是继承了连接到Oracle 11g数据库的Webforms应用程序的Microsoft堆栈(C#,SQL Server,EF等)的开发人员。该应用程序目前充满了我想要转换为参数化存储过程的内联SQL语句。但是,习惯了T-SQL,我发现向PL/SQL转变的过程相当陡峭。返回数据集的Oracle存储过程

大多数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. 使用游标或循环(这似乎邪恶,只是错)

此外,大多数例子中,我发现联机的Oracle存储过程返回一个标量值或根本没有值。我认为这是很多人想要执行的一项相当常见的任务,但是我的google-fu在这个方面一定不是很强大。所以如果有人能帮我翻译,我会很感激。

感谢

+0

只是好奇,为什么你要转换现有的SQL(这也可能为甲骨文工作,取决于)存储过程调用,尤其如果你不舒服的书写PL/SQL(也有其他原因,直接的SQL会优先于存储的特效)。 – tbone

+0

有几个原因。首先,如果格式不正确,内联sql容易受到sql注入攻击的影响。我想要做的另一个主要原因是关于分离的问题。我想将我的数据逻辑放在数据库中,使用专为sql调试而设计的工具更容易阅读和调试。 – NevDull

+0

我的问题是因为你似乎提出的是TAPI设计,这是一个坏主意(而不是从表中选择x,y,z你必须调用某个函数)。有关TAPI和XAPI的更多讨论,请参见[本文](http://stackoverflow.com/questions/3092041/understanding-the-differences-between-table-and-transaction-apis)。另一个有趣的讨论(Tom Kyte和Steve Feurstein)是[这里](https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:672724700346558185)。这些链接中有很多信息!请享用。 – tbone

回答

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的东西,有一些syntactic sugar for implicit results允许程序隐含返回引用游标进行从SQL Server的转换更容易,但你的问题表明你仍然在11g,以致于可能不是一个选项。

您可能还有一个out参数类型为sys_refcursor的过程。但是,通常情况下,您应该使用函数来仅仅返回修改数据的对象的结果和过程。

通常情况下,所有的Oracle过程和函数都会被封装到将相关功能的各个位组合在一起的包中。如果你有半打的功能,让您在使用不同的条件查询foo,你会希望把所有这些功能在单一封装中,只是为了保持组织的事情。

+1

我一直在模糊mssql中的函数和特效之间的界限,因为函数可以返回标量和表值。我想这也是跨越到oracle的。我会给这个镜头。我感到很惊讶,因为每一位曾经编写过数据驱动的Web应用程序的.net开发人员都必须编写CRUD代码才能与数据库交谈,这是多么困难。 – NevDull