PL/SQL 返回 table 的内容
PL/SQL returning contents of a table
目前正在开发用于查看 table 内容的 .Net 应用程序,我在使用 returns table.[=14= 内容的功能时遇到了困难]
我使用Oracle WebLogic Server来连接漫画和应用程序,我有一个功能returns想要记录table但我无法适应它returns所有table.
的记录
我用了tables,对象我一直无法操作管道。
这里是returns一条记录的函数。
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;
对不起我的英语
您的函数 return 是一个适合一行的对象。您需要它 return 一个 table 这样的对象。
所以首先你需要一个 table 类型:
CREATE OR REPLACE TYPE DMD_NT AS TABLE OF DMD_REC;
然后你必须转换你的函数来使用这个新类型。在没有任何其他要求的情况下,当传递 NULL 时,此修订将 select demande
table 中的所有记录:
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 内存中的集合。如果您的 table 很大(比如超过 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;
流水线函数有开销。您应该考虑是否有一种方法可以按照@BobJarvis 的建议使其与 SYS_REFCURSOR 一起使用。
目前正在开发用于查看 table 内容的 .Net 应用程序,我在使用 returns table.[=14= 内容的功能时遇到了困难]
我使用Oracle WebLogic Server来连接漫画和应用程序,我有一个功能returns想要记录table但我无法适应它returns所有table.
的记录我用了tables,对象我一直无法操作管道。 这里是returns一条记录的函数。
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;
对不起我的英语
您的函数 return 是一个适合一行的对象。您需要它 return 一个 table 这样的对象。
所以首先你需要一个 table 类型:
CREATE OR REPLACE TYPE DMD_NT AS TABLE OF DMD_REC;
然后你必须转换你的函数来使用这个新类型。在没有任何其他要求的情况下,当传递 NULL 时,此修订将 select demande
table 中的所有记录:
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 内存中的集合。如果您的 table 很大(比如超过 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;
流水线函数有开销。您应该考虑是否有一种方法可以按照@BobJarvis 的建议使其与 SYS_REFCURSOR 一起使用。