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 一起使用。