待续
创建外键
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,插入几条数据,进行测试即可。