Таблица функций в ORACLE
Вопрос
У меня возникли проблемы с функцией TABLE в 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)
Решение
Прежде всего, вы не можете собирать ассоциативные массивы.Проверьте это для получения дополнительной информации о типах коллекций. 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;
/
Другие советы
(как уже указывалось в комментариях) у вас есть оператор SELECT, встроенный в PL/SQL, без инструкций о том, что делать с результатами запроса.Вы также можете
SELECT INTO
локально объявленную переменную, или вы можете перебирать результаты с помощью курсора, напримерFOR rec IN (SELECT...) LOOP .. END LOOP
;Возможно, вы хотите создать ПАКЕТ вместо анонимного блока;затем в вашей вызывающей программе вы можете выдавать такие запросы, как ваш
SELECT * FROM TABLE(mypackagename.calice_ORACLE(2))
.