【发布时间】:2016-08-19 09:29:45
【问题描述】:
我是 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 中似乎没有这么简单。经过搜索,我找到了以下答案:
- 使用函数而不是过程(这让我想知道 SQL Server 中的过程是否一对一映射到 Oracle 中的过程)
- 为程序创建一个“包”(仍然不太清楚那是什么)
- 使用游标或 for 循环(这看起来很邪恶而且完全错误)
此外,我在网上找到的大多数 Oracle 存储过程示例都返回一个标量值或根本没有值。我认为这是许多人想要执行的一项相当普遍的任务,但我的 google-fu 在这方面一定不是很强。因此,如果有人可以帮助我翻译,我将不胜感激。
谢谢
【问题讨论】:
-
只是好奇为什么要将现有 SQL(可能也适用于 Oracle,取决于)转换为存储过程调用,尤其是如果您不习惯编写 pl/sql(还有其他原因)为什么直接 SQL 比存储过程更受欢迎)。
-
有几个原因。首先也是最重要的是,如果格式不正确,内联 sql 很容易受到 sql 注入攻击。我想这样做的另一个主要原因是关注点分离。我想将我的数据逻辑存放在数据库中,以便使用为 sql 调试而设计的工具更容易阅读和调试。
标签: asp.net oracle stored-procedures oracle11g