我是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中似乎并不那么简单。搜索后,我找到了答案,其中包括:
此外,我在网上找到的Oracle存储过程的大部分示例都会返回标量值或根本没有值。我认为这是一项相当普遍的任务,很多人都希望这样做,但是我的google-fu在这一方面肯定不是很强大。所以如果有人能帮我翻译,我会很感激。
由于
答案 0 :(得分: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中,通过允许过程隐式返回ref游标,有一些syntactic sugar for implicit results可以更轻松地从SQL Server进行转换,但是您的问题表明您仍然使用11g,因此可能不是一个选项。
您还可以拥有类型为out
的{{1}}参数的过程。但是,通常情况下,您应该为仅返回修改数据的对象的结果和过程的对象使用函数。
通常,所有Oracle过程和函数都将被包装到将相关功能部分组合在一起的包中。如果您有六个函数可以让您使用不同的条件查询sys_refcursor
,那么您需要将所有这些函数放在一个包中,以保持组织有序。