oracle存储过程中循环for in是如何使用的

我有个循环 是这样的 for xx in (select col_A,col_B from tableA where col_C=C_value) loopbegin......end end loop;然后我测试了下 in里面的select 语句后面where 的 条件没起作用,就是说带条件 就查出5天数据,不带条件 好几百条数据。结果循环就是按好几百循环的。这个是什么问题 C_value是传进来的参数 ,我调试看了 有值 也没有问题

第1个回答  2019-06-12

1、FOR循环用法,以下是SQL源码:DECLARE  x number; --声明变量BEGIN  x := 1; --给初值  FOR x IN REVERSE 1 .. 10 LOOP    --reverse由大到小    DBMS_OUTPUT.PUT_LINE('x=' || x);  END LOOP;  DBMS_OUTPUT.PUT_LINE('end loop x=' || x); --x=1END。

2、输出结果如图。

3、GOTO用法,以下是SQL源码:DECLARE  x number;BEGIN  x := 0;  <<repeat_loop>> --循环点  x := x + 1;  DBMS_OUTPUT.PUT_LINE(X);  IF x < 9 THEN    --当x的值小于9时,就goto到repeat_loop    GOTO repeat_loop;  END IF;END。

4、WHILE循环用法,以下是SQL源码:DECLARE  x number;BEGIN  x := 0;  WHILE x < 9 LOOP    x := x + 1;    DBMS_OUTPUT.PUT_LINE('x=' || x);  END LOOP;  DBMS_OUTPUT.PUT_LINE('end loop x=' || x);END。

5,输出对应结果。

6、LOOP循环用法,以下是SQL源码:DECLARE  x number;BEGIN  x := 0;  LOOP    x := x + 1;    EXIT WHEN x > 9;    DBMS_OUTPUT.PUT_LINE('x=' || x);  END LOOP;  DBMS_OUTPUT.PUT_LINE('end loop x=' || x);END。

本回答被网友采纳
第2个回答  推荐于2018-02-27

换成显式带参数的游标就可以了,for xx in (select 语句) 这是隐式游标,这个结构中不能带参数,或者说普通的游标,隐式或显式的都不能带参数,使用参数游标或引用(动态)游标。改成这样:

declare
cursor cur(C_value number) is select col_A,col_B from tableA where col_C=C_value
;
begin
    for xx in cur loop
    --处理
    end loop;
end

本回答被网友采纳
第3个回答  2013-08-07
如果C_value是个变量,而且你的变量名称和字段col_C名称一致,oracle会优先任务这个条件是恒真条件,意思说1=1一致。那么可能导致你说的问题,一般变量前面加V_或者其他区别字段名称,防止这种结果。
第4个回答  2017-07-27
你不要写的这么简洁,你用一个带参数的游标替换掉你的括号内部的select语句,用游标类型变量代替xx变量试试看,可能的原因是你传入进来的参数,在匿名游标中访问不到,
第5个回答  2017-07-01
你写的太复杂了,begin 也用错了CREATE OR REPLACE PROCEDURE testForInLoop is w_name varchar2;begin for w_name in (select col from work_oracle_test) loop begin dbms_output.put_line(w_name); end; end loop;end testForInLoop;