oracle
sqlserver-- 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;
/
mysql: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 ;
乙個實用的例子,迴圈刪除大表記錄:
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...