
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;