目前正在使用.Net应用程序来查看表的内容,我遇到了返回表内容的函数的困难。
我使用Oracle WebLogic Server来连接漫画和应用程序,我有一个函数返回表的所需记录但我无法适应它返回表的所有记录。
我使用了桌子,我无法操作管道的物体。 这是返回记录的函数。
CREATE OR REPLACE TYPE DMD_REC AS OBJECT
(
matricule VARCHAR2(10),
nom VARCHAR2(15),
prenom VARCHAR2(15),
adresse VARCHAR2(10),
profile VARCHAR2(15),
service VARCHAR2(15),
date_dmd DATE
);
CREATE OR REPLACE FUNCTION aff_dmd
(dmd_mat IN VARCHAR2)
RETURN DMD_REC IS
dmd_found demande%rowtype;
dmd_rtn DMD_REC;
BEGIN
SELECT *
INTO dmd_found
FROM demande
WHERE demande.matricule=dmd_mat;
dmd_rtn := DMD_REC
(
dmd_found.matricule,
dmd_found.nom,
dmd_found.prenom,
dmd_found.adresse,
dmd_found.profile,
dmd_found.service,
dmd_found.date_dmd
);
RETURN dmd_rtn;
END aff_dmd;
抱歉我的英文
答案 0 :(得分:0)
您的函数返回一个适合一行的对象。您需要它来返回此类对象的表。
首先你需要一个表类型:
CREATE OR REPLACE TYPE DMD_NT AS TABLE OF DMD_REC;
然后你必须将你的函数转换为使用这个新类型。在没有任何其他要求时,此修订将在传递NULL时选择demande
表中的所有记录:
CREATE OR REPLACE FUNCTION aff_dmd
(dmd_mat IN VARCHAR2 := null)
RETURN DMD_NT
IS
dmd_rtn DMD_NT;
BEGIN
SELECT DMD_REC
(
d.matricule,
d.nom,
d.prenom,
d.adresse,
d.profile,
d.service,
d.date_dmd
)
BULK COLLECT INTO dmd_rtn
FROM demande
WHERE
( dmd_mat is null
or d.matricule = dmd_mat
);
RETURN dmd_rtn;
END aff_dmd;
/
BULK COLLECT填充一个存储在 session 内存中的集合。如果您的表很大(例如超过5000),这可能会产生内存资源问题。在这种情况下,您应该考虑创建一个流水线函数:
CREATE OR REPLACE FUNCTION aff_dmd
(dmd_mat IN VARCHAR2 := null)
RETURN DMD_NT PIPELINED
IS
dmd_rtn DMD_NT;
BEGIN
loop
SELECT DMD_REC
(
d.matricule,
d.nom,
d.prenom,
d.adresse,
d.profile,
d.service,
d.date_dmd
)
BULK COLLECT INTO dmd_rtn limit 1000
FROM demande
WHERE
( dmd_mat is null
or d.matricule = dmd_mat
);
exit when dmd_rtn.count() = 0;
for idx in 1..dmd_rtn.count() loop
pipe row (dmd_rtn(idx));
end loop;
end loop
RETURN;
END aff_dmd;
流水线功能有一个开销。您应该考虑是否有一种方法可以使它与SYS_REFCURSOR一起使用,如@BobJarvis建议的那样。