精华内容
下载资源
问答
  • PL/SQL 中的循环语句主要包括LOOP语句、WHERE语句和FOR语句3种。本篇博客主要讲解这三种用法及代码示例。 本篇博客主要围绕 基本语法、简单代码示例,以及实战上常用的示例,这三点来讲解,学习循环看这一篇足够了。...

    当程序需要反复执行某一操作时,就必须使用循环结构。PL/SQL 中的循环语句主要包括LOOP语句、WHERE语句和FOR语句3种。本篇博客主要讲解这三种用法及代码示例。

    本篇博客主要围绕 基本语法、简单代码示例,以及实战上常用的示例,这三点来讲解,学习循环看这一篇足够了。

    LOOP语句

    LOOP语句会先执行一次循环体,然后再判断EXIT WHEN关键字后面的条件表达式是ture还是false,为true的时候退出循环体,否则程序将再次执行循环体。

    基本语法:

    loop
        A;
        EXIT WHEN B;
    END LOOP;
    

    A: 代表循环体中的sql语句,可以是一句也可能是多句,这是循环体核心部分,这些语句至少被执行一遍。
    B: 循环结束条件表达式,为ture时,退出循环,否则再次执行循环体。

    代码示例:

    -- Created on 2020/12/16 by GUO 
    declare 
      i int:= 0;
    begin
      loop
        i:=i+1;
        dbms_output.put_line(i);
        EXIT WHEN i > 3;
      END LOOP;
    end;
    

    运行结果:
    在这里插入图片描述

    实战示例:

    使用Loop+游标的时候,取游标当中的值,必须重新赋值一遍,要不然会报错。

    -- Created on 2020/12/17 by GUO 
    declare
      cursor user is
        select * from user_table;
      user1 user_table%rowtype;
    begin
      open user;
      loop
        fetch user into user1;
        exit when user%notfound;
        dbms_output.put_line('用户名称:' || user1.USER_NAME);
        dbms_output.put_line('用户年龄:' || user1.USER_AGE);
      end loop;
      close user; --关闭游标
    end;
    

    WHILE语句

    在执行之前,首先要判断条件表达式的值是否为true,true则执行循环体,否则退出WHILE循环,继续执行循环后面的代码。

    基本语法:

    while a loop
      b;
    end loop;
    

    A: 表示一个条件表达式,当值为true时,程序执行循环体,否则退出。
    B: 循环体内的sql语句。

    代码示例:

    -- Created on 2020/12/17 by GUO 
    declare
      i int := 0;
    begin
      while i < 3 loop
        i := i + 1;
        dbms_output.put_line(i);
      end loop;
    end;
    

    运行结果:
    在这里插入图片描述

    实战示例:

    -- Created on 2020/12/17 by GUO 
    declare
      cursor user is
        select * from user_table;
      user1 user_table%rowtype;
    begin
      open user;
      fetch user into user1;
      while(user%found)loop
      dbms_output.put_line('用户名称:' || user1.USER_NAME);
      fetch user into user1;
      end loop;
    end;
    

    FOR语句

    FOR语句是一个可提前设置循环次数的循环控制语句,它有一个循环计数器,通常是一个整型变量,通过这个计数器来控制循环次数。

    基本语法:

    for A IN (reverse) B...C LOOP
       D;
     END LOOP;
    

    A: 表示一个变量,通常为证书类型,用来作为计数器,默认值是递增的,当循环当中使用reverse关键字时,就会循环递减。
    B: 计数器下线值,当计数器的值小于下限值的时候,终止循环。
    C: 计数器上线值,当计数器的值大于上限值的时候,终止循环。
    D: 循环体。

    代码示例:

    -- Created on 2020/12/17 by GUO 
    declare 
      i int := 0;
    begin
      for i IN reverse 1..5 LOOP
        dbms_output.put_line(i);
      END LOOP;
    end;
    

    运行结果:
    在这里插入图片描述

    实战示例:

    配合游标使用

    -- Created on 2020/12/17 by GUO 
    declare
      cursor user is
        select * from user_table;
    begin
      for user1 in user loop
      dbms_output.put_line('用户名称:'||user1.USER_NAME);
      dbms_output.put_line('用户年龄:'||user1.USER_AGE);
      end loop;
    end;
    
    
    展开全文
  • 本文实例讲述了Oracle存储过程循环语法。分享给大家供大家参考,具体如下: 1、简单循环 语法 loop statements; end loop; 例子: counter := 0; loop counter := counter + 1; exit when counter = 5; end ...
  • oracle 存储过程循环执行update语句

    万次阅读 2016-05-10 18:26:24
    select column1 from table1 ;...请问在存储过程里如何实现? 请写一个较为完成的存储过程。我会适当再加分的。谢谢! 2012-06-28 13:43 提问者采纳其实二楼写的最简单,但对于新手,最好别那么



    select  column1  from table1 ;对column1进行update操作。由于update时,需要对column1进行特殊处理。如果是java程序里,可以先for循环,然后分别update。请问在存储过程里如何实现?
    请写一个较为完成的存储过程。我会适当再加分的。谢谢!
    2012-06-28 13:43 提问者采纳其实二楼写的最简单,但对于新手,最好别那么写,至于1楼,如果数据不是很多,没必要搞个游标。你也可以看看我写的
    create or replace procedure P_Update(o_vc_message out  varchar2)
    is 
    type column1 is table of table1.column1%type index by binary_integer;
    col1s column1;
    type rid is table of rowid index by binary_integer;
    rids rid;
    temp table1.column1%type;
    begin
      select column1,rowid bulk collect into col1s,rids from table1;
      if (column1.count != 0) then
        for  i in col1s.first..col1s.last loop
          temp := col1s(i);--处理 col1s(i) 想干嘛干嘛
          update table1  set column1 = temp where rowid = rids(i);
        end loop;
      end if; 
      o_vc_message := 'OK!';
    exception 
      when others then
        o_vc_message := 'exception happend.' || sqlcode || sqlerrm;
        rollback;
        return;
    end P_Update; 
    
    如果仅仅是简单处理column1,比如加1什么的,就别搞那么复杂,一个sql就ok了。
    展开全文
  • [color=red]oracle 游标属性 sql%found sql%notfound sql%rowcount[/color] 当执行一条DML语句后,DML语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开...
    首先科普一下:
    
    [color=red]oracle 游标属性 sql%found sql%notfound sql%rowcount[/color]
    当执行一条DML语句后,DML语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。隐式游标只使用 SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三个属性.SQL%FOUND,SQL%NOTFOUND是布尔值,SQL%ROWCOUNT是整数值。

      SQL%FOUND和SQL%NOTFOUND

      在执行任何DML语句前 SQL%FOUND和SQL%NOTFOUND的值都是NULL,在执行DML语句后,SQL%FOUND的属性值将是:

      . TRUE :INSERT

      . TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE.

      . TRUE :SELECT INTO至少返回一行

      当SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。

      SQL%ROWCOUNT

      在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常 NO_DATA_FOUND.

      SQL%ISOPEN

      SQL%ISOPEN是一个布尔值,如果游标打开,则为 TRUE, 如果游标关闭,则为FALSE.对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。

    ==============
    言归正传,一般我们编写存储过程用到游标循环的话,可以这么写:

    declare
    cursor cur is
    select * from iss2_foc_response;
    raw_row iss2_foc_response%rowtype;
    begin
    for raw_row in cur
    loop
    dbms_output.put_line('test');
    end loop;
    end;

    for语句直接帮我们做了游标的打开关闭,以及判断工作。

    我们也可以换一种写法:


    declare
    cursor cur is
    select * from iss2_foc_response;
    raw_row iss2_foc_response%rowtype;
    begin
    open cur;
    FETCH cur
    into raw_row;
    while cur%found
    loop
    dbms_output.put_line('test while');
    FETCH cur
    into raw_row;
    end loop;
    close cur;
    end;

    根据游标的特点,这两种循环的写法是等效的。

    补充一点,游标默认打开是只读游标,如果要在用到游标的时候修改游标中的值,需要在游标定义的时候,加上For update语句。
    展开全文
  • 先来创建一个存储过程: create or replace procedure up_m_Job is begin FOR L_RECORD IN ( select id,real_name,is_login,create_on,(sysdate-create_on) *24*60 as miu from ( select ROW_NUMBER() OVER ...

    先来创建一个存储过程:

    create or replace procedure up_m_Job is
    begin
      FOR L_RECORD IN ( select id,real_name,is_login,create_on,(sysdate-create_on) *24*60 as miu from (
     select  ROW_NUMBER() OVER (PARTITION BY m.id ORDER BY o.create_on desc ) AS Row1
     ,m.id,m.real_name,m.is_login,o.create_on from MANAGEMENT_USER m inner join 
     (select * from OPERATION_LOG t where t.oprate_type='1') o on m.id=o.create_user_id) where row1=1) 
    LOOP
        IF (L_RECORD.IS_LOGIN =2 and L_RECORD.MIU>=30)    
          THEN 
            UPDATE MANAGEMENT_USER
               SET IS_LOGIN='1'
             WHERE id=L_RECORD.ID;
        END IF;
     END LOOP;
    end;

    这个存储过程逻辑是:循环一个查询记录,接着根据条件修改某一个表,

     

    存储过程创建完了,接下去我们创建一个定时任务,用来执行存储过程

    1.定时器对应的DBMS_Jobs文件夹,右键新建(new)

    2、创建任务

      (1)、在what值中填写待执行的存储过程,多个可以,隔开

      (2)、在间隔中填写执行时间策略;(具体写法见下述备注)

     

    注:job的定时执行和时间间隔说明

    间隔/interval是指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用‘sysdate+m’表示。
    (1).每分钟执行
    Interval => TRUNC(sysdate,'mi') + 1/ (24*60)

    每小时执行

    Interval => TRUNC(sysdate,'hh') + 1/ (24)

    (2).每天定时执行
    例如:每天的凌晨1点执行
    Interval => TRUNC(sysdate+ 1)  +1/ (24)

    (3).每周定时执行
    例如:每周一凌晨1点执行
    Interval => TRUNC(next_day(sysdate,'星期一'))+1/24

    (4).每月定时执行
    例如:每月1日凌晨1点执行
    Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

    (5).每季度定时执行
    例如每季度的第一天凌晨1点执行
    Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

    (6).每半年定时执行
    例如:每年7月1日和1月1日凌晨1点
    Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

    (7).每年定时执行
    例如:每年1月1日凌晨1点执行
    Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

     

    查看任务

    如果想查看一些脚本,处理通过打开文件夹的方式,也可以使用更方便的sql语句进行查看。

    1

    SELECT FROM dba_jobs;

    注意,如果next_date是4000-1-1表示这个脚本已经是停止状态。

    展开全文
  • 本文转载自:...   create or replace procedure pr_zhaozhenlong_loop/*名称:在存储过程中执行3种循环语句功能:利用循环给表中插入数据调用: begin -- Call the proce...
  • 我现在需要一个存储过程,这个存过里只存放删除 XXXX_TABLE表 的分区语句,只保留每个月最后一天的分区,我该怎么写啊
  • oracle存储过程--循环插入数据

    千次阅读 2019-10-11 19:29:49
    1、在表account中循环...create or replace procedure test is --存储过程,名称为test v_id int; --声明变量 begin v_id := 1001; --ACCOUNT_ID从1001插到1005 while v_id <= 1005 --设置插入的次数 loop...
  • NULL 博文链接:https://xiaosheng12345.iteye.com/blog/1984408
  • Oracle之创建存储过程SQL语句

    千次阅读 2020-05-19 17:23:26
    1、创建存储过程。 create or replace procedure myprocedure(sid in number) as exam number; begin select * from score where sid=score.userid; dbms_output.put_line(exam); if exam>60 then dbms_o
  • 针对oracle数据库做数据迁移或者定时任务时,会存在一些字段多,数据量大的情况,使用 单单使用 insert into …select 语句有可能会导致运行时间长,且运行不成功的情况 1) 选择字段使用 游标进行分组,将数据分为...
  • Oracle存储过程游标for循环怎么写

    千次阅读 2018-05-18 10:34:00
    首先编写存储过程的整体结构,如下: create or replace procedure test_proc is v_date date; --变量定义 begin select sysdate into v_date from dual; end test_proc; 定义游标: create ...
  • create or replace procedure BackUpData(taskCode varchar2) is VCOUNT1 INT; VCOUNT2 INT; BKNAME VARCHAR(13); SQLLOOP VARCHAR2(512); ... SELECT '_'||TO_CHAR(SYSDATE,'MMdd') INTO BKNAME FROM DUAL;...
  • 一、创建存储过程语句 语法: CREATE OR REPLACE PROCEDURE testname( argument1 TYPE1, ....) AS BEGIN ...... END testname 例子: CREATE OR REPLACE PROCEDURE test_name( arg1 VARCHAR2,arg2 number,arg....
  • Oracle存储过程中跳出循环的写法

    千次阅读 2019-06-06 14:43:19
    转载自:https://www.cnblogs.com/haldir/p/5533414.html 记录exit和return的用法 exit用来跳出循环 loop IF V_KBP IS NULL THEN EXIT; END IF; ...return跳出存储过程 loop IF V_KBP IS NULL THEN ...
  • 存储过程执行增删改查sql   下边是一个简单的数据库表,为了方便,我都定义成了varchar 类型。 1、存储过程执行增加sql   首先写一个增加的存储过程: create or replace procedure test_add_procedure ...
  • Oracle存储过程

    万次阅读 多人点赞 2019-07-01 14:52:17
    Oracle存储过程详解 procedure 1.创建Oracle存储过程 prodedure create or replace procedure test(var_name_1 in type,var_name_2 out ty pe) as --声明变量(变量名 变量类型) begin --存储过程的执行体 end ...
  • ORACLE存储过程

    万次阅读 多人点赞 2018-11-02 18:14:48
    oracle存储过程 目录 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 ...
  • loop退出循环体: 1. goto next; <<next>> null; 2. exit when boolean表达式; 示例: CREATE OR REPLACE PROCEDURE pro_end_loop(i_num NUMBER) AS v_ind NUMBER DEFAULT 1; v_num NUMBER; BEGIN ...
  • oracle存储过程执行sql

    2019-09-05 16:41:46
    --这里演示的是备份表 可以多个表,如果需要请留言 DECLARE sql_tem VARCHAR2(110); tableName VARCHAR2(110); BEGIN SELECT 'APP_TABLE_'||TO_CHAR(SYSDATE,'yyyymmddhh24miss') into tableName FROM dual;...
  •  /*****************循环执行选课表t_teach_choice_course 的重复数据start *********/  dbms_output.put_line('************delete t_teach_choice_course data start***********');  for choiceCourseTemp ...
  • 关于Oracle存储过程中拼接in语句以及自定义split函数
  • 使用for loop向表中批量插入数据,推荐使用plsql执行,Dbvisualizer语句执行会出错
  •  for x in cur loop--游标取值 循环  i_jdid :=x.jdid;  i_ryid:=x.rybh;  --自己的语句  update xxx set xx='3' where x=i_jdid;  update xxxx set xxxxx='3' where xx=i_ryid;  end loop; --这...
  • oracle存储过程中的while loop循环示例

    千次阅读 2017-04-20 16:22:57
    --声明一个循环变量 begin  load_date := to_date('201001', 'yyyymm'); --给循环变量赋初始值  while load_date  to_date(to_char(add_months(sysdate, -1), 'yyyymm'), 'yyyy
  • oracle存储过程(写法+实战)

    千次阅读 2019-12-25 16:25:53
    1、 先看看oracle存储过程的格式: create or replace procedure p_add(num1 in number, num2 in number, result out number) --参数,可为空 as /*result number;*/ --这里还可以定义变量 begin r...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,258
精华内容 18,103
关键字:

oracle存储过程循环语句