2016-01-23 65 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一起工作。