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)

Foi útil?

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 exemplo FOR 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)).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top