Asp.net 返回数据集的Oracle存储过程
我是Microsoft stack C、SQL Server、EF等的开发人员,它继承了一个连接到Oracle 11g数据库的webforms应用程序。该应用程序当前包含内联SQL语句,我想将其转换为参数化存储过程。然而,由于习惯了T-SQL,我发现向PL/SQL的迁移是一个相当陡峭的学习过程 大多数SQL语句都是相当简单的语句,它们从基表返回经过筛选的数据集Asp.net 返回数据集的Oracle存储过程,asp.net,oracle,stored-procedures,oracle11g,Asp.net,Oracle,Stored Procedures,Oracle11g,我是Microsoft stack C、SQL Server、EF等的开发人员,它继承了一个连接到Oracle 11g数据库的webforms应用程序。该应用程序当前包含内联SQL语句,我想将其转换为参数化存储过程。然而,由于习惯了T-SQL,我发现向PL/SQL的迁移是一个相当陡峭的学习过程 大多数SQL语句都是相当简单的语句,它们从基表返回经过筛选的数据集 select field1, field2, fieldn from foo where field1 = 'blah' 在T-S
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存储过程示例都返回标量值或根本不返回值。我认为这是一个相当普遍的任务,许多人都想执行,但我的谷歌浏览器在这方面一定不是很强大。如果有人能帮我翻译,我将不胜感激
多亏了一个只返回结果集的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;
在Oracle12.1中,允许过程隐式返回ref游标,从而简化了SQL Server的转换,但您的问题表明您仍然使用11g,因此这可能不是一个选项
您还可以有一个具有sys\U refcursor类型out参数的过程。但是,通常情况下,您应该对仅返回结果的对象使用函数,对修改数据的对象使用过程
通常,您的所有Oracle过程和功能都将打包到包中,这些包将一些相关功能组合在一起。如果您有六个函数可以使用不同的条件查询foo,那么您可能希望将所有这些函数放在一个包中,以使事情井然有序。只是想知道为什么要转换可能也适用于Oracle的现有SQL,这取决于存储过程调用,如果您对编写pl/sql感到不舒服,那么还有其他原因可以说明为什么直接sql比存储过程更受欢迎。首先也是最重要的是,如果格式不正确,内联sql很容易受到sql注入攻击。我想这样做的另一个主要原因是分离关注点。我想把我的数据逻辑放在数据库中,在那里使用为sql调试而设计的工具更容易阅读和调试。我的问题是,你似乎建议的是TAPI设计,这是一个坏主意,而不是从表a中选择x,y,z,你必须调用一些函数。有关TAPI和XAPI的更多讨论,请参阅。另一个有趣的讨论是Tom Kyte和Steve Feurstein。在这些链接中有很多信息!喜欢。我总是模糊mssql中函数和进程之间的界限,因为函数可以返回标量值和表值。我想这也会影响到甲骨文。我来试一试。我很惊讶这是多么难挖掘,因为每个曾经编写过数据驱动web应用程序的.net开发人员都必须编写CRUD代码才能与DB对话。