Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 返回数据集的Oracle存储过程_Asp.net_Oracle_Stored Procedures_Oracle11g - Fatal编程技术网

Asp.net 返回数据集的Oracle存储过程

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

我是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-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对话。