| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Re: Remove rows from a cursor?
> This is the first time I have seen the lag function. In theory this
> would help me crunch data, however, I tried using it in a cursor and
> it fails.
>
> I am trying to get the difference between the previous row and the
> current row's accum_amount, using 8.1.7:
>
> CURSOR sel_load_info IS
> SELECT column_01 AS acct_no,
> column_02 AS payer_code,
> column_03 AS display_order,
> column_05 AS dscr,
> column_06 AS units,
> column_07 AS rate,
> column_08 AS amount,
> column_09 AS accum_amt,
> column_09 -
> lag(column_09, 1, 0) over (ORDER BY column_01, column_03) AS
> net_amt
> FROM customer_upload;
>
> It gets the following compile error (highlighting the "(" after
> "over":
>
> PLS-00103: Encountered the symbol "(" when expecting one of the
> following:
> , from
>
> I know that I can fetch column_09 into variable and do the math after
> each fetch, but I wanted to try this approach first.
>
> Any ideas why this fails? Can the lag function not be used within a
> cursor? The documentation does not state.
>
> Thanks,
> Vince
Hello Vince
Most probably it fails because you're using 8i. In 8i only a subset of Oracle's 8i SQL Features are supported in PL/SQL, most noteably, the analytic functions are not yet supported. This changes in 9i.
What you want to do (*as*a*workaround*) until you have 9i:
set serveroutput on size 100000
create table customer_upload (
column_01 varchar2(100), column_02 varchar2(100), column_03 varchar2(100), column_05 varchar2(100), column_06 varchar2(100), column_07 varchar2(100), column_08 varchar2(100), column_09 number
insert into customer_upload values ('a','b','c','e','f','g','h',100);
insert into customer_upload values ('A','B','C','E','F','G','H',200);
insert into customer_upload values ('*','x','u','x','w','l','h',150);
insert into customer_upload values ('Z','Y','Q','M','.','_','H', 50);
create or replace procedure eee as
type cur_t is ref cursor;
cur cur_t;
v_acct_no varchar2(100); v_payer_code varchar2(100); v_display_order varchar2(100); v_dscr varchar2(100); v_units varchar2(100); v_rate varchar2(100); v_amount varchar2(100); v_accum_amt number; v_net_amt number;
begin
open cur for 'SELECT column_01 AS acct_no,
column_02 AS payer_code,
column_03 AS display_order,
column_05 AS dscr,
column_06 AS units,
column_07 AS rate,
column_08 AS amount,
column_09 AS accum_amt,
column_09 -
lag(column_09, 1, 0) over (ORDER BY column_01, column_03) AS
net_amt
loop
fetch cur into
v_acct_no,
v_payer_code,
v_display_order ,
v_dscr ,
v_units ,
v_rate ,
v_amount ,
v_accum_amt ,
v_net_amt;
exit when cur%notfound;
dbms_output.put_line ('net_amt: ' || v_net_amt);
/* do something */
end loop;
end;
/
Hope this helps
Rene
-- Recherchen im schweizerischen Handelsregister: http://www.adp-gmbh.ch/SwissCompanies/Search.php3Received on Fri Jul 05 2002 - 12:35:52 CDT
![]() |
![]() |