Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.misc -> How to use cursor properly?
I tried to write a procedure to qurey one row of record back. However,
I got different errors at different syntax of cursor as following.
PROCEDURE GetTheQuote
(p_orderID IN purchase_requests.order_id%TYPE, o_quoteID IN OUT spotbuy_quotes.quote_id%TYPE, o_quotedate IN OUT spotbuy_quotes.quote_date%TYPE, o_fsc IN OUT spotbuy_quotes.fsc%TYPE, o_niin IN OUT spotbuy_quotes.niin%TYPE, o_partNumber IN OUT spotbuy_quotes.part_number%TYPE, o_nomen IN OUT spotbuy_quotes.nomen%TYPE, o_locid IN OUT spotbuy_quotes.loc_id%TYPE, o_qty IN OUT spotbuy_quotes.qty%TYPE, o_ui IN OUT spotbuy_quotes.qty_unit%TYPE, o_remarks IN OUT spotbuy_quotes.remarks%TYPE, o_errFlag OUT NUMBER, o_advMsg OUT VARCHAR2 ) IS TYPE c_quote_type IS REF CURSOR RETURN spotbuy_quotes%ROWTYPE; quote_cur c_quote_type; BEGIN OPEN quote_cur FOR SELECT quote_id, fsc, niin, part_number, nomen, loc_id, qty, qty_unit, quote_date, approved, remarks FROM spotbuy_quotes WHERE order_id = p_orderID; FETCH quote_cur INTO v_quote_id, v_fsc, v_niin,v_partNum, v_nomen, v_locid, v_qty, v_qtyUnit, v_quotedate, v_approved, v_remarks;
If I replace above with
...
CURSOR quote_cur IS SELECT quote_id, fsc, niin, part_number, nomen, loc_id, qty, qty_unit, quote_date, approved, remarks FROM spotbuy_quotes WHERE order_id = p_orderID; quote_rec quote_cur%ROWTYPE;
BEGIN OPEN quote_cur;
FETCH quote_cur INTO v_quote_id, v_fsc, v_niin, v_partNum, v_nomen, v_locid, v_qty, v_qtyUnit,
v_quotedate, v_approved, v_remarks; IF quote_cur%NOTFOUND THEN o_errFlag:= 1; ELSE o_quoteID := v_quote_id; o_quotedate := v_quotedate; o_fsc := v_fsc; o_niin := v_niin; o_partNumber := v_partNum; o_nomen := v_nomen; o_locid := v_locid; o_qty := v_qty; o_ui := v_qtyUnit; o_remarks := v_remarks; END IF;
SELECT quote_id, fsc, niin, part_number, nomen, loc_id, qty, qty_unit, quote_date, approved, remarks FROM spotbuy_quotes WHERE order_id = p_orderID; quote_rec quote_cur%ROWTYPE; BEGIN OPEN quote_cur; FETCH quote_cur INTO quote_rec; IF quote_cur%NOTFOUND THEN o_errFlag:= 1; ELSE o_quoteID := quote_rec.quote_id; o_quotedate := quote_rec.quote_date; o_fsc := quote_rec.fsc; o_niin := quote_rec.niin; o_partNumber := quote_rec.part_Number; o_nomen :=quote_rec.nomen; o_locid := quote_rec.loc_id; o_qty := quote_rec.qty; o_ui := quote_rec.qty_Unit; o_remarks := quote_rec.remarks; o_errFlag:= 0; END IF; CLOSE quote_cur;
Cause error - the ORA-02005: Implicit(-1) length not valid for this bind or define datatype in run time
I have tried following and I got the same error. PROCEDURE GetTheQuote
(p_orderID IN purchase_requests.order_id%TYPE, o_quoteID IN OUT tbl_quote_id, o_quotedate IN OUT tbl_reqDate, o_fsc IN OUT tbl_fsc, o_niin IN OUT tbl_niin, o_partNumber IN OUT tbl_partNum, o_nomen IN OUT tbl_nomen, o_locid IN OUT tbl_loc_id, o_qty IN OUT tbl_qty, o_ui IN OUT tbl_qtyUnit, o_remarks IN OUT tbl_remarks, o_errFlag OUT NUMBER, o_advMsg OUT VARCHAR2 ) IS v_count BINARY_INTEGER DEFAULT 1; v_errCode NUMBER; v_errText VARCHAR2(200); CURSOR quote_cur IS SELECT quote_id, fsc, niin, part_number, nomen, loc_id, qty, qty_unit, quote_date, approved, remarks FROM spotbuy_quotes WHERE order_id = p_orderID; quote_rec quote_cur%ROWTYPE; BEGIN OPEN quote_cur; FETCH quote_cur INTO quote_rec; IF quote_cur%NOTFOUND THEN o_errFlag:= 1; ELSE o_quoteID(v_count) := quote_rec.quote_id; o_quotedate(v_count) := quote_rec.quote_date; o_fsc(v_count) := quote_rec.fsc; o_niin(v_count) := quote_rec.niin; o_partNumber(v_count) := quote_rec.part_Number; o_nomen(v_count) :=quote_rec.nomen; o_locid(v_count) := quote_rec.loc_id; o_qty(v_count) := quote_rec.qty; o_ui(v_count) := quote_rec.qty_Unit; o_remarks(v_count) := quote_rec.remarks; o_errFlag:= 0; END IF; CLOSE quote_cur;
..
END;
My ASP page :
sbPak = "{call IPV$vd2_spotbuy.GetTheQuote(?, {resultset 1, o_quoteID,"
&_
" o_quotedate, o_fsc, o_niin, o_partNumber, o_nomen, " &_ " o_locid, o_qty, o_ui, o_remarks, o_errFlag, o_advMsg})}" Set theQuote = Server.CreateObject("ADODB.Command") ... theQuote(0) = orderID
Set rsSBquote = Server.CreateObject("ADODB.Recordset") ...
rsSBquote.Open theQuote
All my cursor syntax follows the standard syntax from PL/SQL programming book. Why it the static cause the error? Does that mean I have to use dynamic cursor? ( I have a similar case using dynamic cursor and works) From the book, it said that static is better than dynamic. Any guru can give some tip here? Thanks ahead.
C Chang Received on Fri Jan 04 2002 - 23:35:51 CST