oracle 游标 循环 指向下一条

oracle 游标 循环 指向下一条
如下,cursor执行过程是什么呢?我调试的好像死循环了,仅仅执行到第一个if语句
cursor tj_czl_temp1 is
select n_sum,tzfw from Table_1;
open tj_czl_temp1;
fetch tj_czl_temp1 into v_emp_1;

while tj_czl_temp%found loop
if v_emp_1.czdw ='440300010000'then
v_czl_sj_1:= v_emp_1.n_sum0;--1
elsif v_emp_1.czdw ='440307010000' then
v_czl_lg_1:= v_emp_1.n_sum0;--2
elsif v_emp_1.czdw ='440303010000' then
v_czl_lh_1:= v_emp.n_sum0;--3
elsif v_emp_1.czdw ='440304010000' then
v_czl_ft_1:= v_emp.n_sum0;--4
elsif v_emp_1.czdw ='440305010000' then
v_czl_ns_1:= v_emp.n_sum0;--5
elsif v_emp_1.czdw ='440308010000' then
v_czl_yt:= v_emp.n_sum0; --6
elsif v_emp_1.czdw ='440306010000' then
v_czl_ba_1:= v_emp.n_sum0;--7
elsif v_emp_1.czdw ='440309010000' then
v_czl_gm_1:= v_emp.n_sum0;--8
elsif v_emp_1.czdw ='440310010000' then
v_czl_ps_1:= v_emp.n_sum0;--9
end if;
end loop;
close tj_czl_temp;
如果游标有6条记录,那为什么不向下执行呢?怎么改?
那请问一、二楼,怎么填充下一条数据呢?
在end loop前,加一句fetch tj_czl_temp1 into v_emp_1; 就可以了吗?这句的原理是?
我用9个变量记录选出来的值,指向下一条记录我不太明白
SQL> DECLARE
2 v_id INT;
3 v_value VARCHAR(10);
4 -- 定义游标.
5 CURSOR c_test_main IS
6 SELECT id, value FROM test_main;
7 BEGIN
8 -- 打开游标.
9 OPEN c_test_main;
10 -- 填充数据.
11 FETCH c_test_main INTO v_id, v_value;
12 -- 假如检索到了数据,才处帆缺理.
13 WHILE c_test_main%FOUND LOOP
14 dbms_output.put_line(v_value);
15 -- 填充下一条数据.
16 FETCH c_test_main INTO v_id, v_value;
17 END LOOP;
18 -- 关闭游标
19 CLOSE c_test_main;
20 END;
21 /
TWO
THREE
ONE

PL/SQL procedure successfully completed.

楼主的循环里面,没有 "填充下一条数据"

--

我那个颂激例子写得很清楚了

10 -- 填充数据.
11 FETCH c_test_main INTO v_id, v_value;

15 -- 填充下一条数据.
16 FETCH c_test_main INTO v_id, v_value;

如态樱辩果游标有6条记录
第一次 FETCH INTO 读取到 第一条数据
这个时候,
tj_czl_temp%found = true 因为 获取到了数据。

但是你那个循环里面, 再也没有 获取数据了
也就是,一直处于 tj_czl_temp%found 的情况下

在 END LOOP; 前面,增加一句
fetch tj_czl_temp1 into v_emp_1;
也就是 再去拿下一条数据,
如果游标有6条记录
那么 循环外面的拿到了 第一行
那么 这个循环里面的, 拿到了 第2行、第3行、第4行、第5行、第6行、
在尝试拿第7行的时候, 拿不到数据
那么 tj_czl_temp%found 就 = fasle 了
循环就结束。

实现思路就是简袭先定义一个游标,之后直接用loop语句循环就可以了。

CREATE OR REPLACE PROCEDURE TEST_CURSOR(NAME_COPY IN VARCHAR) IS
   友凯   VAR_USER_NAME VARCHAR2(20);
      VAR_USER_ID   VARCHAR2(50);
      VAR_INPUT      VARCHAR(20);
      VAR_TIME         DATE;
      CURSOR MY_CURSOR IS  SELECT USER_NAME FROM GAODEBAO;
BEGIN
     SELECT MAX(TIME) INTO VAR_TIME FROM USER_NAME ;
  拦告兄   IF VAR_TIME IS NULL THEN  
        VAR_TIME:=SYSDATE;
     END IF;
   OPEN MY_CURSOR;
   LOOP
      FETCH MY_CURSOR INTO VAR_USER_NAME;
       VAR_USER_ID:= SYS_GUID();
       EXIT WHEN MY_CURSOR%NOTFOUND;
       BEGIN
          INSERT INTO USER_NAME(USER_NAME,USER_ID,TIME) VALUES(VAR_USER_NAME,VAR_USER_ID,VAR_TIME );
          COMMIT;
        VAR_TIME:=  VAR_TIME+1;
        END;
      END LOOP;
     
      IF MY_CURSOR%ISOPEN THEN
     CLOSE MY_CURSOR;
      END IF;
END TEST_CURSOR;

在end loop前,加一句fetch tj_czl_temp1 into v_emp_1;
← 上一篇: 下一篇: →