Home » SQL & PL/SQL » SQL & PL/SQL » Record vs Object problem (Oracle 11g)
Record vs Object problem [message #600579] Fri, 08 November 2013 11:04 Go to next message
ageless1946
Messages: 3
Registered: November 2013
Junior Member
I have a stored procedure that is attempting a bulk collect from a execute immediate. It works if I define:

create or replace procedure t_test(idList IN varchar2) IS
BEGIN
DECLARE
type trec is record (id NUMBER, key VARCHAR2(36));
type ttable_TYPE is table of trec;
ttable ttable_type;
dyn_sql varchar2(500);
BEGIN
dyn_sql := 'SELECT ID, KEY FROM TTABLE WHERE ID IN ( ' || idList || ')'
EXECUTE IMMEDIATE DYN_SQL
BULK COLLECT INTO ttable;

END;
END;

the problem is that I really need to do the following:

CREATE OR REPLACE TYPE TREC AS OBJECT
(
ID NUMBER,
KEY VARCHAR2(36)
);
/
CREATE OR REPLACE TYPE TTABLE AS TABLE OF TREC;
/

create or replace procedure t_test(idList IN varchar2, return_array IN OUT ttable) IS
BEGIN
DECLARE
dyn_sql varchar2(500);
BEGIN
dyn_sql := 'SELECT ID, KEY FROM TTABLE WHERE ID IN ( ' || idList || ')'
EXECUTE IMMEDIATE DYN_SQL
BULK COLLECT INTO return_array;

END;
END;

the error I get on the EXECUTE IMMEDIATE IS
ORA-00932: inconsistent datatypes: expected - got -

the only difference is that the external TYPE is an OBJECT versus the internal stored procedure type of RECORD
Re: Record vs Object problem [message #600580 is a reply to message #600579] Fri, 08 November 2013 11:19 Go to previous messageGo to next message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member
use COPY & PASTE to show us exactly how T_TEST was invoked.
Re: Record vs Object problem [message #600581 is a reply to message #600580] Fri, 08 November 2013 11:38 Go to previous messageGo to next message
ageless1946
Messages: 3
Registered: November 2013
Junior Member
cstatement = connection.prepareCall("{call t_test(?, ?) }");
cstatement.setString(1, tr.getAccountListString());
cstatement.registerOutParameter (2, java.sql.Types.ARRAY,"CTPLATDBA.TTABLE");
cstatement.execute();
Re: Record vs Object problem [message #600586 is a reply to message #600579] Fri, 08 November 2013 12:40 Go to previous message
ageless1946
Messages: 3
Registered: November 2013
Junior Member
I found the problem.

I needed to specify the object type in the select to establish the type it is dealing with.

CREATE OR REPLACE TYPE TREC AS OBJECT
(
ID NUMBER,
KEY VARCHAR2(36)
);
/

CREATE OR REPLACE TYPE TTABLE AS TABLE OF TREC;
/



create or replace procedure t_test(idList IN varchar2, return_array IN OUT ttable) IS
BEGIN
DECLARE
dyn_sql varchar2(500);
BEGIN
dyn_sql := 'SELECT T_REC(ID, KEY) FROM SOMETABLE WHERE ID IN ( ' || idList || ')'
EXECUTE IMMEDIATE DYN_SQL
BULK COLLECT INTO return_array;

END;
END;

Previous Topic: Dynamic Condition in STATIC SQL
Next Topic: ORA-01839: date not valid for month specified
Goto Forum:
  


Current Time: Tue Apr 23 22:07:05 CDT 2024