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

我有个循环是这样的forxxin(selectcol_A,col_BfromtableAwherecol_C=C_value)loopbegin......endendl... 我有个循环 是这样的 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是传进来的参数 ,我调试看了 有值 也没有问题 展开
 我来答
刺友互
高粉答主

2019-06-12 · 每个回答都超有意思的
知道答主
回答量:3979
采纳率:100%
帮助的人:71.4万
展开全部

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。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
psychic0111
推荐于2018-02-27 · TA获得超过999个赞
知道小有建树答主
回答量:463
采纳率:100%
帮助的人:222万
展开全部

换成显式带参数的游标就可以了,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
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
woaigigi66
2013-08-07 · TA获得超过176个赞
知道答主
回答量:75
采纳率:100%
帮助的人:45.9万
展开全部
如果C_value是个变量,而且你的变量名称和字段col_C名称一致,oracle会优先任务这个条件是恒真条件,意思说1=1一致。那么可能导致你说的问题,一般变量前面加V_或者其他区别字段名称,防止这种结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
节子不哭
2017-07-27 · TA获得超过461个赞
知道小有建树答主
回答量:340
采纳率:85%
帮助的人:164万
展开全部
你不要写的这么简洁,你用一个带参数的游标替换掉你的括号内部的select语句,用游标类型变量代替xx变量试试看,可能的原因是你传入进来的参数,在匿名游标中访问不到,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bu...3@sohu.com
2017-07-01 · TA获得超过319个赞
知道小有建树答主
回答量:247
采纳率:81%
帮助的人:38.4万
展开全部
你写的太复杂了,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;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式