2009-12-28 61 views
0

我有一些概率與ORACLE功能表。功能表在Oracle

SET SERVEROUTPUT ON SIZE 100000; 

DECLARE 

int_position NUMBER(20); 

TYPE T_REC_EMP IS RECORD ( nameFile VARCHAR2(200));  

R_EMP T_REC_EMP ; -- variable enregistrement de type T_REC_EMP 

TYPE TAB_T_REC_EMP IS TABLE OF T_REC_EMP index by binary_integer ; 
t_rec TAB_T_REC_EMP ; -- variable tableau d''enregistrements 


PROCEDURE Pc_Insert (v_value IN VARCHAR2) IS 
BEGIN 

    if t_rec.exists(t_rec.Last) then 
    int_position := t_rec.last; 
    int_position := int_position +1; 

    t_rec(int_position).nomFichier := v_value; 
    else 
    t_rec(1).nomFichier :=v_value; 
    end if; 

END; 

FUNCTION calice_ORACLE(n IN NUMBER) RETURN T_REC_EMP PIPELINED IS 

BEGIN 

    FOR i in 1 .. n LOOP 
    PIPE ROW(t_rec(i)); 
    END LOOP; 

    RETURN; 
END; 

BEGIN 

    Pc_Insert('allo1'); 
    Pc_Insert('allo2'); 
    Pc_Insert('allo3'); 

    SELECT * fROM TABLE(calice_ORACLE(2)); 

END; 
/

我對功能的一些錯誤不會在SQL語句中支持(我在9i的9.2 VR)

+0

什麼是ORA錯誤? – 2009-12-28 21:04:56

+2

選擇。 。 。進入。 。 ? – Guru 2009-12-28 21:11:00

+1

+1你必須選擇一些東西 – wadesworld 2009-12-28 21:27:16

回答

1

首先,你不能pipline聯合陣列。檢查這個更多關於集合類型的信息。 http://www.developer.com/db/article.php/10920_3379271_2/Oracle-Programming-with-PLSQL-Collections.htm

其次,你需要選擇進入或在PL/SQL中使用遊標。

我寫了一些演示代碼,這樣就可以查了一下它如何能工作。我不太清楚你真正想做什麼,但至少這是編譯好的,這很好。

create or replace type t_rec_emp as object (namefile varchar2(200));  
/

create or replace type tab_t_rec_emp is table of t_rec_emp; 
/

create or replace package mydemopack as 
    t_rec tab_t_rec_emp := tab_t_rec_emp(); 
    procedure pc_insert (v_value in varchar2); 
    function calice_oracle(n in integer) return tab_t_rec_emp pipelined; 

end; 
/

create or replace package body mydemopack as 
    procedure pc_insert (v_value in varchar2) is 
    begin 
     t_rec.extend(1); 
     t_rec(t_rec.count):= t_rec_emp(v_value); 
    end; 

    function calice_oracle(n in integer) return tab_t_rec_emp pipelined is 

    begin 

     for i in 1 .. n loop 
     pipe row(t_rec(i)); 
     end loop; 

     return; 
    end; 
end; 
/


declare 
    cursor c_cur is 
     select * from table(myDemoPack.calice_oracle(2)); 
begin 

    myDemoPack.pc_insert('allo1'); 
    myDemoPack.pc_insert('allo2'); 
    myDemoPack.pc_insert('allo3'); 

    for rec in c_cur loop 
     dbms_output.put_line(rec.namefile); 
    end loop; 

end; 
/
1
  • (如在評論中已經指出的那樣),你有一個SELECT嵌入在PL/SQL中的語句,並沒有說明如何處理查詢結果。您可以使用SELECT INTO這個本地聲明的變量,也可以使用遊標來循環播放結果。 FOR rec IN (SELECT...) LOOP .. END LOOP;

  • 也許你想創建一個包,而不是一個匿名塊;那麼,在你的通話程序中,你可以發出像你的SELECT * FROM TABLE(mypackagename.calice_ORACLE(2))這樣的查詢。