由于您使用的是 Oracle,我将创建流水线 TABLE 函数。
该函数接受参数并返回一个对象(您必须创建它)
然后您使用 TABLE() 函数从中选择 * 甚至特定列,并且可以将其与 WHERE 子句或 JOIN 一起使用。如果您想要一个重用单元(一个函数),您不仅限于返回值(即标量函数),您可以编写一个返回行或记录集的函数。
像这样:
FUNCTION RETURN_MY_ROWS(Param1 IN type...ParamX IN Type)
RETURN PARENT_OBJECT PIPELINED
IS
local_curs cursor_alias; --you need a cursor alias if this function is in a Package
out_rec ROW_RECORD_OF_CUSTOM_OBJECT:=ROW_RECORD_OF_CUSTOM_OBJECT(NULL, NULL,NULL) --one NULL for each field in the record sub-object
BEGIN
OPEN local_curs FOR
--the SELECT query that you're trying to encapsulate goes here
-- and it can be very detailed/complex and even have WITH () etc..
SELECT * FROM baseTable WHERE col1 = x;
-- now that you have captured the SELECT into a Cursor
-- here you put a LOOP to take what's in the cursor and put it in the
-- child object (that holds the individual records)
LOOP
FETCH local_curs --opening the ref-cursor
INTO out_rec.COL1,
out_rec.COL2,
out_rec.COL3;
EXIT WHEN local_curs%NOTFOUND;
PIPE ROW(out_rec); --piping out the Object
END LOOP;
CLOSE local_curs; -- always do this
RETURN; -- we're now done
END RETURN_MY_ROWS;
完成后,你可以像这样使用它
SELECT * FROM TABLE(RETURN_MY_ROWS(val1, val2));
你可以插入 SELECT 甚至 CREATE TABLE 出来,你可以把它放在连接中。
还有两件事要提:
--ROW_RECORD_OF_CUSTOM_OBJECT is something along these lines
CREATE or REPLACE TYPE ROW_RECORD_OF_CUSTOM_OBJECT AS OBJECT
(
col1 type;
col2 type;
...
colx type;
);
而 PARENT_OBJECT 是我们刚刚创建的另一个对象(带有字段定义)的表
create or replace TYPE PARENT_OBJECT IS TABLE OF ROW_RECORD_OF_CUSTOM_OBJECT;
所以这个函数需要两个OBJECT来支持,一个是记录,另一个是记录的表(你必须先创建记录)。
简而言之,该函数很容易编写,您需要一个子对象(带有字段)和一个父对象,该父对象将容纳该子对象的 TABLE 类型的子对象,然后打开原始基础- 如果您在一个包中,并且您从该游标从循环中读取到各个记录中,则将 SQL 提取到 SYS_REFCURSOR(您可能需要别名)中的表。
该函数返回一个 PARENT_OBJECT 类型,但在其内部将记录子对象与游标中的值打包在一起。
我希望这对您有用(如果您想创建 OBJECT 和表函数,您的 DBA 可能存在权限问题)*/