Sagewire Logo

Oracle stored proc problem

3 Message(s) by 2 Author(s) originally posted in cfml database access


From: dongzky Date:   Monday, October 22, 2007
HI, I have created a stored proc in oracle similar below: CREATE OR REPLACE PACKAGE PACK_REFCURSOR_NHM_TRANSACTION AS
TYPE TRANS_TableRows IS REF CURSOR
RETURN NHM_TRANSACTION%ROWTYPE;
PROC EDURE REFCUR_NHM_TRANSACTION (
IN_sTMPACC IN string,
IN_sITEM_TYPES IN string,
OUT_TRANS OUT TRANS_TableRows);
END PACK_REFCURSOR_NHM_TRANSACTION ;

/
-- the above works fine
--but this one below has the error when
CREATE OR REPLACE PACKAGE BODY PACK_REFCURSOR_NHM_TRANSACTION AS
PROCEDURE REFCUR_NHM_TRANSACTION (
IN_sTMPACC IN string,
IN_sITEM_TYPES IN string,
OUT_TRANS OUT TRANS_TableRows) IS
BEGIN

OPEN OUT_TRANS FOR
SELECT T.TRANSACTION_ID, T.TRANSACTION_TYPE, T.TRANSACTION_DATE,
T.TRANSACTION_TIME,
T.ITEM_CODE, 0 OE_DETAIL_ID,
T.QUANTITY, T.LIST_PRICE, T.DISCOUNT, T.SALE_PRICE, T.GST_AMOUNT,
'I'INSURER_TYPE
FROM NHM_TRANSACTION T
WHERE DISPENSED_FLG = 'Y'
AND T.ACCOUNT_ID = IN_sTMPACC
AND T.TRANSACTION_TYPE IN ('01','02', '09')
AND NVL(T.STATUS,'F') != 'C'
AND T.BILLED_FLG = 'N'
AND T.ITEM_TYPE IN (IN_sITEM_TYPES)
AND T.BILL_ITEM_FLG = 'Y'
UNION ALL
SELECT T.OE_TRANSACTION_ID TRANSACTION_ID, TRANSACTION_TYPE,
T.TRANSACTION_DATE,
T.TRANSACTION_TIME, NVL(T.ITEM_CODE,T.PACKAGE_CODE) ITEM_CODE,
T.OE_DETAIL_ID,
T.QUANTITY, T.LIST_PRICE, T.DISCOUNT, T.SALE_PRICE, T.GST_AMOUNT, 'S'
INSURER_TYPE
FROM NHC_OE_TRANSACTION T, NHC_MASTER_ITEM M, NHM_PACKAGE P
WHERE T.ACCOUNT_ID = IN_sTMPACC
AND T.ITEM_CODE = M.ITEM_CODE(+)
AND T.PACKAGE_CODE = P.PACKAGE_CODE(+)
AND (DECODE(T.ITEM_CODE,NULL,P.BILL_OPTION,M.BILL_OPTION) in ('P','O','F'))
AND NVL(T.STATUS,'F') != 'C'
AND T.BILLED_FLG = 'N'
AND ((T.TRANSACTION_TYPE = '09' AND STATUS IN ('P','R'))
OR T.TRANSACTION_TYPE IN ('01','02','11','12', '10'))
AND T.BILL_ITEM_FLG = 'Y'
AND T.ITEM_TYPE IN (IN_sITEM_TYPES) ;

END REFCUR_NHM_TRANSACTION ;
END PACK_REFCURSOR_NHM_TRANSACTION ;

--this gives error: PLS-00382: expression is of wrong type

but when I tried to change the query similar to this:

OPEN OUT_TRANS FOR
SELECT T.*
FROM NHM_TRANSACTION T
WHERE DISPENSED_FLG = 'Y'
AND T.ACCOUNT_ID = IN_sTMPACC
AND T.TRANSACTION_TYPE IN ('01','02', '09')
AND NVL(T.STATUS,'F') != 'C'
AND T.BILLED_FLG = 'N'
AND T.ITEM_TYPE IN (IN_sITEM_TYPES)
AND T.BILL_ITEM_FLG = 'Y' ;

--that worked fine. what I found out is the proc does not seem to work with
complicated queries. instead it works only in something similar to SELECT T.*?
and not when individual fields are extracted? I can not understand why? can
anyone help me with this> thanks.


From: paross1 Date:   Monday, October 22, 2007
I think what is hapenning is that you are declaring the reference cursor in
your package spec as a "strong" type as a rowtype of table NHM_TRANSACTION.
However, in your OPEN FOR SELECT statement, you are selecting columns that do
not exist in the the NHM_TRANSACTION table, such as 0 OE_DETAIL_ID,
'I'INSURER_TYPE, etc.

You'd be much better off to declare your reference cursor as a "weak" type
so that your OPEN FOR SELECT statement actually defines the return structure:

TYPE TRANS_TableRows
IS REF CURSOR;

In other words, leave off the RETURN NHM_TRANSACTION%ROWTYPE in your ref
cursor declaration, and you'd probably be OK (assuming, of course, that all
of the columns selected in your UNION statements are like data types).

Phil


From: dongzky Date:   Tuesday, October 23, 2007
@xxxxxxxxxxx : it worked. thanks for the help. I really appreciate it.



Next Message: Trouble with MSSQL query



Programming | Sports | Autos

copyright 2006
Valid XHTML 1.0 Transitional