我是继承了连接到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中似乎很简单。在搜索,我找到了答案,其中包括:
- 使用功能,而不是一个程序(这使我怀疑,如果在SQL Server地图一到一个程序在Oracle程序)
- 创建“包”的程序(还是不太清楚那是什么)
- 使用游标或循环(这似乎邪恶,只是错)
此外,大多数例子中,我发现联机的Oracle存储过程返回一个标量值或根本没有值。我认为这是很多人想要执行的一项相当常见的任务,但是我的google-fu在这个方面一定不是很强大。所以如果有人能帮我翻译,我会很感激。
感谢
只是好奇,为什么你要转换现有的SQL(这也可能为甲骨文工作,取决于)存储过程调用,尤其如果你不舒服的书写PL/SQL(也有其他原因,直接的SQL会优先于存储的特效)。 – tbone
有几个原因。首先,如果格式不正确,内联sql容易受到sql注入攻击的影响。我想要做的另一个主要原因是关于分离的问题。我想将我的数据逻辑放在数据库中,使用专为sql调试而设计的工具更容易阅读和调试。 – NevDull
我的问题是因为你似乎提出的是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