ORA-00932: tipos de dados inconsistentes: esperado - obtido -
Uso o Oracle (10g.2) como programador PHP há quase 3 anos, mas quando dei uma tarefa, tentei usar os cursores ref e os tipos de coleção pela primeira vez. E pesquisei na web, quando me deparei com problemas, e esse erro ora-00932 realmente me impressionou. Preciso de ajuda de um veterano.
Aqui está o que eu tenho abordado, quero selecionar linhas de uma tabela e colocá-las em um cursor ref e, em seguida, usando o tipo de registro, reuni-las em uma matriz associativa. E novamente a partir dessa matriz associativa, faça um cursor ref. Não me pergunte por que, estou escrevendo um código tão complicado, porque preciso dele para tarefas mais complexas. Posso parecer confuso para você, portanto, deixe-me mostrar meus códigos.
Eu tenho 2 tipos definidos na guia tipos no sapo. Um deles é um tipo de objeto:
CREATE OR REPLACE
TYPE R_TYPE AS OBJECT(sqn number,firstname VARCHAR2(30), lastname VARCHAR2(30));
Outro é o tipo de coleção que está usando o tipo de objeto criado acima:
CREATE OR REPLACE
TYPE tr_type AS TABLE OF r_type;
Então eu crio um pacote:
CREATE OR REPLACE PACKAGE MYPACK_PKG IS
TYPE MY_REF_CURSOR IS REF CURSOR;
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR);
END MYPACK_PKG;
Corpo do pacote:
CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
rcur MYPACK_PKG.MY_REF_CURSOR;
sql_stmt VARCHAR2(1000);
l_rarray tr_type := tr_type();
l_rec r_type;
BEGIN
sql_stmt := 'SELECT 1,e.first_name,e.last_name FROM hr.employees e ';
OPEN rcur FOR sql_stmt;
LOOP
fetch rcur into l_rec;
exit when rcur%notfound;
l_rarray := tr_type( l_rec );
END LOOP;
CLOSE rcur;
--OPEN r_cursor FOR SELECT * FROM TABLE(cast(l_rarray as tr_type) );
END MY_PROC;
END MYPACK_PKG;
Comentei a última linha em que abro o cursor ref. Porque está causando outro erro quando executo o procedimento no SQL Editor do Toad, e é a segunda pergunta que vou fazer. Por fim, eu corro o código no Toad:
variable r refcursor
declare
r_out MYPACK_PKG.MY_REF_CURSOR;
begin
MYPACK_PKG.MY_PROC(r_out);
:r := r_out;
end;
print :r
Aí recebo o erro ora-00932.