改写一下游标 select * from (select rownum aaa, ... from ... order by aaa desc) where rownum <=1; 不就能得到最后一条了吗?
回复:sanmmu %FOUDN和%NOTFOUND已经是最后一条的后面了,我就是想在最后一条的时候进行一些操作。 回复:fenixshadow and mantisXF SQL%ROWCOUNT不是总行数,是我的程序的问题?还是版本的问题?(oracle 10g) 程序: CREATE OR REPLACE PROCEDURE TESTN IS cTMP_COL TEST_02.COL1%TYPE; CURSOR cur_TEST IS SELECT COL1 FROM TEST_02; BEGIN OPEN cur_TEST; DBMS_OUTPUT.PUT_LINE('*****SQL%ROWCOUNT**********************==' || SQL%ROWCOUNT || '=='); DBMS_OUTPUT.PUT_LINE('*****cur_TEST%ROWCOUNT*****************==' || cur_TEST%ROWCOUNT || '=='); LOOP FETCH cur_TEST INTO cTMP_COL; EXIT WHEN cur_TEST %NOTFOUND; DBMS_OUTPUT.PUT_LINE('SQL%ROWCOUNT==' || SQL%ROWCOUNT || '=='); DBMS_OUTPUT.PUT_LINE('cur_TEST%ROWCOUNT==' || cur_TEST%ROWCOUNT || '=='); END LOOP; END; / 输出结果:【 DBMS_OUTPUT 値 】 *****SQL%ROWCOUNT**********************==== *****cur_TEST%ROWCOUNT*****************==0== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==1== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==2== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==3== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==4== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==5== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==6== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==7== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==8== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==9== SQL%ROWCOUNT==== cur_TEST%ROWCOUNT==10==回复:wang_wuhui 可以详细说说吗?回复:bjt_ 我不是只要最后一条,是想到最后一条的时候做某些操作 拿到循环外面做太麻烦,有没有办法提前先得到纪录条数,提前执行SQL文求COUNT(*)的方法可以,我只是觉得这个方法太笨,而且浪费效率,我记得8i里是不可以的,10g里不知道有没有更好的方法。
daclare num number(1000); num:=0; loop num:=num+1; when num=mycursor%rowcount-1 then RAISE_APPLICATION_ERROR (-20205, '这是最后一条记录'); fetch mycursor ........ .............
exit when mycursor%nofound; end loop;
回复:wang_wuhui 可以详细说说吗?回复:bjt_ 我不是只要最后一条,是想到最后一条的时候做某些操作 ----------------------------- 引用lz的部门话,如果是那么个意思.那么简单的修改程序体即可. 作个简化的过程declare r sys_refcursor; vRow tab%rowtype; vName tab.tname%type; vAmount int; begin open r for select * from tab where tname like 'T%'; vAmount:=0; fetch r into vRow; while r%found loop vAmount:=vAmount+1; ..... fetch r into vRow; end loop; if vAmount>0 then --处理最后一条记录. end if; end if;
declare r sys_refcursor; vRow tab%rowtype; vName tab.tname%type; vAmount int; begin open r for select * from tab where tname like 'T%'; vAmount:=0; fetch r into vRow; while r%found loop vAmount:=vAmount+1; ..... fetch r into vRow; end loop; if vAmount>0 then --处理最后一条记录. --vrow就是最后一条记录,楼主可以随便处理的 end if; end if;
cursor_name%NOTFOUND如果最近一次提取游标操作FETCH失败则为true,否则为false。
所以楼主可以根据这个两个属性fetch的成功与否来判断是不是最后一条。
select * from
(select rownum aaa, ... from ... order by aaa desc)
where rownum <=1;
不就能得到最后一条了吗?
%FOUDN和%NOTFOUND已经是最后一条的后面了,我就是想在最后一条的时候进行一些操作。
回复:fenixshadow and mantisXF
SQL%ROWCOUNT不是总行数,是我的程序的问题?还是版本的问题?(oracle 10g)
程序:
CREATE OR REPLACE PROCEDURE TESTN
IS
cTMP_COL TEST_02.COL1%TYPE;
CURSOR cur_TEST IS
SELECT COL1 FROM TEST_02;
BEGIN
OPEN cur_TEST;
DBMS_OUTPUT.PUT_LINE('*****SQL%ROWCOUNT**********************==' || SQL%ROWCOUNT || '==');
DBMS_OUTPUT.PUT_LINE('*****cur_TEST%ROWCOUNT*****************==' || cur_TEST%ROWCOUNT || '=='); LOOP
FETCH cur_TEST INTO cTMP_COL;
EXIT WHEN cur_TEST %NOTFOUND;
DBMS_OUTPUT.PUT_LINE('SQL%ROWCOUNT==' || SQL%ROWCOUNT || '==');
DBMS_OUTPUT.PUT_LINE('cur_TEST%ROWCOUNT==' || cur_TEST%ROWCOUNT || '==');
END LOOP;
END;
/
输出结果:【 DBMS_OUTPUT 値 】
*****SQL%ROWCOUNT**********************====
*****cur_TEST%ROWCOUNT*****************==0==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==1==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==2==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==3==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==4==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==5==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==6==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==7==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==8==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==9==
SQL%ROWCOUNT====
cur_TEST%ROWCOUNT==10==回复:wang_wuhui
可以详细说说吗?回复:bjt_
我不是只要最后一条,是想到最后一条的时候做某些操作
拿到循环外面做太麻烦,有没有办法提前先得到纪录条数,提前执行SQL文求COUNT(*)的方法可以,我只是觉得这个方法太笨,而且浪费效率,我记得8i里是不可以的,10g里不知道有没有更好的方法。
num:=0;
loop
num:=num+1;
when num=mycursor%rowcount-1 then
RAISE_APPLICATION_ERROR (-20205,
'这是最后一条记录');
fetch mycursor ........
.............
exit when mycursor%nofound;
end loop;
可以详细说说吗?回复:bjt_
我不是只要最后一条,是想到最后一条的时候做某些操作
-----------------------------
引用lz的部门话,如果是那么个意思.那么简单的修改程序体即可.
作个简化的过程declare
r sys_refcursor;
vRow tab%rowtype;
vName tab.tname%type;
vAmount int;
begin
open r for select * from tab where tname like 'T%';
vAmount:=0;
fetch r into vRow;
while r%found loop
vAmount:=vAmount+1;
.....
fetch r into vRow;
end loop;
if vAmount>0 then --处理最后一条记录. end if;
end if;
r sys_refcursor;
vRow tab%rowtype;
vName tab.tname%type;
vAmount int;
begin
open r for select * from tab where tname like 'T%';
vAmount:=0;
fetch r into vRow;
while r%found loop
vAmount:=vAmount+1;
.....
fetch r into vRow;
end loop;
if vAmount>0 then --处理最后一条记录.
--vrow就是最后一条记录,楼主可以随便处理的
end if;
end if;