Tabela de funções no Oracle
Pergunta
Eu tenho algum problema com a tabela de funções no 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;
/
Sou algum erro sobre função não suporta na instrução SQL (estou no 9i 9,2 VR)
Solução
Primeiro de tudo, você não pode fazer matrizes assiativas. Verifique isso para obter mais informações sobre os tipos de coleção. http://www.developer.com/db/article.php/10920_3379271_2/oracle-programming-with-plsql-collections.htm
Segundo, você precisa selecionar ou usar o cursor no PL/SQL.
Eu escrevi um código de demonstração para que você possa verificar um pouco como ele pode funcionar. Não tenho muita certeza do que você realmente quer fazer, mas pelo menos essas compilações, o que é bom.
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;
/
Outras dicas
(Como já apontado nos comentários) Você tem uma instrução SELECT incorporada em PL/SQL sem instruções sobre o que fazer com os resultados da consulta. Você também pode
SELECT INTO
uma variável de base localmente, ou você pode percorrer os resultados com um cursor, por exemploFOR rec IN (SELECT...) LOOP .. END LOOP
;Talvez você queira criar um pacote em vez de um bloco anônimo; Então, em seu programa de chamada, você pode emitir perguntas como o seu
SELECT * FROM TABLE(mypackagename.calice_ORACLE(2))
.