Oracle相当于返回内联表的存储过程?

时间:2015-07-08 13:28:12

标签: oracle stored-procedures plsql oracle11g inline

T-SQL中的示例(SQL Server - 取自here):

CREATE PROC proc_authors
    @au_lname VARCHAR(40)
AS
    SELECT  
        au_id, au_fname, au_lname, city, state
    FROM authors
    WHERE au_lname = @au_lname
go

在Oracle中是否可以创建一个返回内联表的存储过程(不声明类型 - 如上所述)?如果没有,最接近的替代方案是什么?即声明内联类型,然后使用它。我们的想法是尽量减少授予的数据库权限。

请将示例代码作为答案的一部分。

使用存储过程与功能背后的推理 - 我们有遗留软件只能执行存储过程或原始查询。似乎只有那里的存储过程支持参数化执行,这就是我们所追求的。

2 个答案:

答案 0 :(得分:1)

也许你正在寻找这样的东西:

create table author
(
    au_id number,
    au_name varchar2(100)
);

insert into author (au_id, au_name) values(1, 'ME');

create or replace function getAuthor(auName varchar2)
return author%rowtype
is
    retval author%rowtype;
begin
    select *  into retval from author where au_name=auName;
    return retval;
end;

declare
 auth author%rowtype;
begin
    auth := getAuthor('ME');
    dbms_output.put_line(auth.au_id);
end;

答案 1 :(得分:1)

使用ref cursor

尝试此操作
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE TupleSections #-}

import Z3.Monad
import Control.Monad.IO.Class
import Control.Applicative
import Data.Traversable
import Prelude hiding (sequence)

main = do
    out <- evalZ3 $ do
        is  <- mkIntSort
        _3  <- mkInteger 3
        _5  <- mkInteger 5
        _10 <- mkInteger 10
        x   <- mkFreshIntVar "x"
        y   <- mkFreshIntVar "y"
        y2  <- mkBvmul y y

        assert =<< mkAnd =<< sequence
            [ mkEq x y2
            ]
        return ()

    print "end"

您将从您的表中收集所有数据,您可以在java或调用程序中进行迭代。