2016-01-23 62 views
0

目前在用于查看表内容的.Net应用程序上工作时,我遇到了返回表内容的函数的困难。返回表的内容的PL/SQL

我使用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

你的函数会返回一个适合一行的对象。你需要它返回一个这样的对象表。

所以首先你需要一个表类型:

CREATE OR REPLACE TYPE DMD_NT AS TABLE OF DMD_REC; 

然后你要转换的功能,使用这种新的类型。在没有任何其他要求,本次修订将选择demande表中的所有记录时,一个NULL传递:

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填充存储在会议内存的集合。如果你的表很大(比如超过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一起工作。