資料庫的迴圈

2021-08-09 04:50:39 字數 3994 閱讀 2306

oracle

-- oracle

-- goto

declare

l_i number;

begin

l_i := 10;

<>

l_i := l_i - 1;

dbms_output.put_line(l_i);

if l_i > 0 then

goto repeat_loop; -- 當小於10時候goto到repeat_loop

end if;

end;

-- for

declare

l_i number; --宣告變數

begin

l_i := 0; --給初值

for l_i in reverse 1 .. 10 loop

dbms_output.put_line('l_i=' || l_i);

end loop;

dbms_output.put_line('end loop:l_i=' || l_i);

end;

/-- while

declare

l_d date;

begin

l_d := to_date('2016-01-01', 'yyyy-mm-dd');

while l_d < to_date('2017-10-10', 'yyyy-mm-dd') loop

insert into t1_bak

select *

from t

where datatime > l_d

and datatime <= l_d + 30;

commit;

dbms_output.put_line('l_d=' || l_d);

l_d := l_d + 30;

end loop;

end;

-- loop

declare

l_i number;

begin

l_i := 0;

loop

l_i := l_i + 1;

exit when l_i > 10;

dbms_output.put_line('l_i=' || l_i);

end loop;

dbms_output.put_line('out_loop l_i=' || l_i);

end;

/

sqlserver

declare @stime1 datetime;

declare @etime1 datetime;

set @stime1='2016-01-01'

set @etime1='2016-02-01'

while (@stime1<'2017-01-01')

begin

exec dbo.[p_test] -- 呼叫過程

@sdate=@stime1,

@edate=@etime1

select @stime1;

set @stime1=dateadd(m,1,@stime1);

set @etime1=dateadd(m,1,@etime1);

-- waitfor delay '00:00:30' sleep30秒

end;

mysql:

delimiter $$

drop procedure if exists `p_test`$$

create procedure `p_test`()

begin

declare v_cnt int;

select 1 into v_cnt ;

while v_cnt<=10 do

set v_cnt=v_cnt+1;

end while;

end$$

delimiter ;

說明:mysql沒有匿名過程,但是可以在過程中使用

乙個實用的例子,迴圈刪除大表記錄:

delimiter $$

drop procedure if exists `p_del_hisdata`$$

create procedure `p_del_hisdata`()

begin

declare v_cnt int;

declare v_date datetime default '2019-08-01';

declare v_tbl varchar(30);

begin

declare no_more_data integer default 0;

declare cur_tbl cursor for

select t.table_name

from information_schema.tables t

where t.table_name in ('t_etl_histab1','t_etl_histab2')

and t.table_schema='db1';

declare continue handler for not found set no_more_data=1;

open cur_tbl ;

repeat

begin

fetch cur_tbl into v_tbl;

set @v_sql=concat('select count(1) into @p_num from ', v_tbl,' where datatime <\'', v_date, '\' limit 1');

prepare p_sql from @v_sql;

-- select @v_sql;

execute p_sql;

deallocate prepare p_sql;

while @p_num>0 do

set @v_sql=concat('delete from ', v_tbl,' where datatime <\'', v_date, '\' limit 1000');

prepare p_sql from @v_sql;

-- select @v_sql;

execute p_sql;

deallocate prepare p_sql;

set @v_sql=concat('select count(1) into @p_num from ', v_tbl,' where datatime <\'', v_date, '\' limit 1');

prepare p_sql from @v_sql;

-- select @v_sql;

execute p_sql;

deallocate prepare p_sql;

end while;

end;

until no_more_data end repeat;

close cur_tbl;

end;

end$$

delimiter ;

mysql的儲存過程中,定義變數有兩種方式:

1.使用set或select直接賦值,變數名以 @ 開頭.

例如:set @var=1;

可以在乙個會話的任何地方宣告,作用域是整個會話,稱為會話變數。

2.以 declare 關鍵字宣告的變數,只能在儲存過程中使用,稱為儲存過程變數,例如:

declare var1  int default 0;  

主要用在儲存過程中,或者是給儲存傳引數中。

另外在儲存過程中,使用動態語句,預處理時,動態內容必須賦給乙個會話變數。

例:set @v_sql= "select now()";

prepare stmt from @v_sql;  

execute stmt;     

deallocate prepare stmt;

Oracle資料庫迴圈更新

oracle資料庫 更新資料時 update test table1 t set t.name 1 where name ergou 單一更新乙個是比較容易理解 實際情況經常需要更新大量資料 例如從表更新到另外的表 嘗試了挺多次,update test table1 t test table2 e ...

陣列資料迴圈寫入資料庫的問題

if request action do then set lr sp server.createobject adodb.recordset if ubound arr1 0 then lr sp insert into dongtai test buzhou1,shuoming1 values ...

ORACLE 資料庫中for迴圈的使用。

涉及到批量新增有規律的資料的時候,往往會涉及到迴圈,有for迴圈,有while迴圈,以前插入資料經常在程式裡面寫迴圈,沒有想過原來oracle中自帶迴圈語法,既然用到了,就當隨筆記錄下來,以方便以後查閱。for迴圈示例 i number 用for實現 begin for i in 101 10000...