Oracle与MySQL存储过程以及游标使用的区别

待续

创建外键

constraint foreign_key_name foreign key ('plan_id') references 'plan' ('p_id') on delete cascade//级联删除

constraint foregin_key_name foreign key ('plan_id') references  'plan' ('p_id') on delete set null//级联置空


Oracle:
as
ppid number(19);即可
不需要在begin,end里面


MySQL:
定义变量  DECLARE
#在其他语句之前!在begin end语句里面


对于变量的赋值
set ppid = ppid +1;
或者 ppid :=ppid +1;#未测试,网上资料上可以


select max(column_name)into wid from work;
#在work表中列名为 column_name的最大值取出来赋值给wid
三种循环
1、WHILE……DO……END WHILE
2、REPEAT……UNTIL END REPEAT
3、LOOP……END LOOP
1:while(pstime between btime and etime)do
#body
  end while;
2:repeat
#body
   util(pstime not between btime and etime);
   end repeat
3、servicesloop:loop#给loop取个名字,随便取
      if(done = 1) then
leave servicesloop;#取了名字才好执行
end if;#这里涉及了if的用法
end loopservicesloop;


这里基本的insert、update、delete不赘述,具体参考sql语言;


重头戏--游标!
嵌套游标,动态参数游标


#MySQL游标结束需要捕捉一个错误
#这也就是看到MySQL声明游标之后总有这么一句话 
#前提 DECLARE DONE TINYINT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1;
#这句话一定要紧跟着声明游标后面。




#由于我先接触的是Oracle,当我开始用MySQL的时候,就觉得MySQL太麻烦了!
#首先 MySQL不支持动态游标,其次MySQL没有%ROWTYPE这种用法,
Oracle:
CURSOR plan is select * from User ;
plans plan%ROWTYPE;
open plan;
loop
fetch plan into plans;
#不需要判断,当游标里的数据都被取用之后循环自动结束
insert into work (wid,w_status)
values(plans.pp_id,plans.p_status)
#Oralce的用法
end loop;
close plan;
MySQL:
declare done , userid default 0;
declare plan CURSOR for select user_id from User;
declare continue handler for not found set done = 1;
open plan;
userloops:loop
fetch plan into userid;
#MySQL的用法,不能如Oracle定义一个 游标%ROWTYPE 变量拿来用,需要装到一个个变量里面去,且取的时候要对齐;
if(done) then
leave userloops;
end if;
end loop userloops;
close plan;


#MySQL用到两个游标的时候,在同一个begin end里面,他们共用一个done变量,例如:
declare plan for select * from plan;
declare user for select * from user;
declare continue handler for not found set done = 1;


#也可以嵌套




 


MySQL里面的变量定义 不能跟 列名 相同!!!不然MySQL会把列表当变量,起冲突!!!
#这个问题折磨我了三天!一直找不出来自己写的存储过程有什么错误的,运行时候也不会出错


2014/8/16

mysql里游标open使用完后close,再打开,又可以重新遍历数据




【以下为转载】
mysql日期和字符相互转换
 
date_format(date,'%Y-%m-%d')    
-------------->oracle中的to_char(); 
str_to_date(date,'%Y-%m-%d')     
-------------->oracle中的to_date(); 
  www.2cto.com  
%Y:代表4位的年份 
%y:代表2为的年份 
 
%m:代表月, 格式为(01……12)  
%c:代表月, 格式为(1……12) 
 
%d:代表月份中的天数,格式为(00……31)  
%e:代表月份中的天数, 格式为(0……31) 
 
%H:代表小时,格式为(00……23)  
%k:代表 小时,格式为(0……23)  
%h: 代表小时,格式为(01……12)  
%I: 代表小时,格式为(01……12)  
%l :代表小时,格式为(1……12) 
  
%i: 代表分钟, 格式为(00……59) 
 
%r:代表 时间,格式为12 小时(hh:mm:ss [AP]M)  
%T:代表 时间,格式为24 小时(hh:mm:ss) 


在当前的日期上加三天,天数随便改:
SELECT date_add(CURRENT_DATE(), interval 3 day);
 
在指定的日期上加三天:
SELECT date_add('2012-01-01', interval 3 day);
 
在指定的具体时间上加一个时间:

    如在"2012年1月1日两点"加上一个小时零十分零十秒的MySQL语句为:
    select date_add('2012-01-01 2:00:00', interval '1:10:10' hour_second);
 
其他的根据下面的函数依此类推吧。
select date_add(日期, interval 1 day);        -- add 1 day
select date_add(日期, interval 1 hour);       -- add 1 hour
select date_add(日期, interval 1 minute);     -- ...
select date_add(日期, interval 1 second);
select date_add(日期, interval 1 microsecond);
select date_add(日期, interval 1 week);
select date_add(日期, interval 1 month);
select date_add(日期, interval 1 quarter);
select date_add(日期, interval 1 year);


【以下为转载】
主要有以下五种循环:Exit When、Loop、While、For(普通循环)、For(游标循环),下面举例一一说明(均为存储过程)。


1、Exit When循环:
create or replace procedure proc_test_exit_when is
i number;
begin
i:=0;
LOOP
Exit When(i>5);
Dbms_Output.put_line(i);
i:=i+1;
END LOOP;
end proc_test_exit_when;
——————————————————–俺是分割线—————————————————————–
2、Loop循环:
create or replace procedure proc_test_loop is
i number;
begin
i:=0;
loop
i:=i+1;
dbms_output.put_line(i);
if i>5 then
exit;
end if;
end loop;
end proc_test_loop;
——————————————————–俺是分割线—————————————————————–
3、While循环:
create or replace procedure proc_test_while is
i number;
begin
i:=0;
while i<5 loop
i:=i+1;
dbms_output.put_line(i);
end loop;
end proc_test_while;
——————————————————–俺是分割线—————————————————————–
4、For普通循环:
create or replace procedure proc_test_for is
i number;
begin
i:=0;
for i in 1..5 loop
dbms_output.put_line(i);
end loop;
end proc_test_for;
——————————————————–俺是分割线—————————————————————–
5、For游标循环:
create or replace procedure proc_test_cursor is
userRow test%rowtype;
cursor userRows is
select * from test;
begin
for userRow in userRows loop
dbms_output.put_line(userRow.id||’,'||userRow.Name||’,'||userRows%rowcount);
end loop;
end proc_test_cursor;
——————————————————–俺是分割线—————————————————————–
上面所示为存储过程相应代码,你可以通过如下方式进行测试:
进入pl/sql, 执行 文件->新建->程序窗口->空白,拷贝以上各段代码,到pl/sql空白窗口中,安F8执行编译。
再 执行 文件->新建->命令窗口 进入命令窗口 执行一下  set serveroutput on 这句代码,然后,输入exec 相应存储过程,ok。
第5中循环 要求新建一个名为test的表 字段 id、name,插入几条数据,进行测试即可。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值