2009-12-28 1 views
0

У меня есть проблема с функцией TABLE в 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 вр)

+0

Что такое ошибка ORA? –

+2

Выбрать. , , в. , ? – Guru

+1

+1 вам нужно выбрать что-то – wadesworld

ответ

1

Прежде всего, вы не можете связываться с ассоциативными массивами. Проверьте это для получения дополнительной информации о типах коллекций. 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
  • (как уже отмечалось в комментариях) у вас есть ВЫБРАТЬ заявление, встроенное в PL/SQL, без инструкций о том, что делать с результатами запроса. Вы можете либо SELECT INTO локально объявленной переменной, либо вы можете LOOP через результаты с помощью курсора, например. FOR rec IN (SELECT...) LOOP .. END LOOP;

  • Возможно, вы хотите создать ПАКЕТ вместо анонимного блока; то в вашей вызывающей программе вы можете выдать запросы, например, ваш SELECT * FROM TABLE(mypackagename.calice_ORACLE(2)).

 Смежные вопросы

  • Нет связанных вопросов^_^