加入收藏 | 设为首页 | 会员中心 | 我要投稿 济宁站长网 (https://www.0537zz.cn/)- 行业智能、边缘计算、专有云、AI硬件、5G!
当前位置: 首页 > 站长百科 > 正文

Oracle与MySQL的SQL语句区别

发布时间:2021-03-17 09:46:57 所属栏目:站长百科 来源:网络整理
导读:1数据库 /* ? mysql可以创建数据库,而oracle没有这个操作,oracle只能创建实例; ? sql数据库操作:database ? 格式: ? ? * create database 数据库名; ? ? * create database 数据库名 character set 字符集; */ CREATE DATABASE j0815_1;? CREATE DATABAS
编号 类别 ORACLE MYSQL 注释 1 IF语句使用不同 IF?iv_weekly_day = ‘MON‘THEN
?????? ii_weekly_day := ‘MON‘;
ELSIF?iv_weekly_day = ‘TUE‘?THEN
?????? ii_weekly_day := ‘TUE‘;
END IF; IF?iv_weekly_day = ‘MON‘THEN
????? set ii_weekly_day = ‘MON‘;
ELSEIF?iv_weekly_day = ‘TUE‘?THEN
????? set ii_weekly_day = ‘TUE‘;
END IF;?? 1. mysql和oracle除了关键字有一个字差别外(ELSEIF/ELSIF),if语句使用起来完全相同.?
2. mysql if语句语法: 摘自 MySQL 5.1 参考手册 20.2.12.1. IF语句?
IF search_condition THEN statement_list
??? [ELSEIF search_condition THEN statement_list] ...
??? [ELSE statement_list]
END IF
IF实现了一个基本的条件构造。如果search_condition求值为真,相应的SQL语句列表被执行。如果没有search_condition匹配,在ELSE子句里的语句列表被执行。statement_list可以包括一个或多个语句。 2 FOR语句不同 FOR?li_cnt IN 0..(ii_role_cnt-1)?LOOP
??? SELECT COUNT(*) INTO li_role_ik_cnt FROM SD_ROLE
??? WHERE ROLE_CD = lo_aas_role_upl(li_cnt);
??? IF li_role_ik_cnt = 0? THEN
??????? RETURN ‘N‘;
??? END IF;
??? li_role_ik_cnt := -3;
END LOOP;? loopLable:LOOP
? IF i > (ii_role_cnt-1) THEN
??? LEAVE looplable;
? ELSE
??? SELECT COUNT(*) INTO li_role_ik_cnt FROM SD_ROLE
??? WHERE ROLE_CD = ‘ADMIN_SUPER‘; /*lo_aas_role_upl(li_cnt);*/
??? IF li_role_ik_cnt = 0? THEN
?????? RETURN ‘N‘;
??? END IF;
??? SET li_role_ik_cnt = -3;
??? SET i = i+1;
?? END IF;
?END LOOP loopLable;
1. oracle使用For语句实现循环.?
?? Mysql使用Loop语句实现循环.?
2. oracle 使用For…loop关键字.?
?? Mysql使用loopLable:LOOP实现循环.? 3 while语句不同 WHILE?lv_inputstr IS NOT NULL?LOOP
...
END LOOP; WHILE?lv_inputstr IS NOT NULL?DO
...
END WHILE; 1. oracle 中使用while语句关键字为: while 表达式 loop… end loop;
??? mysql 中使用while语句关键字为: while 表达式 do… end while; ?
  • 存储过程&Function
编号 类别 ORACLE MYSQL 注释 1 创建存储过程语句不同 create or replace procedure P_ADD_FAC(
???id_fac_cd? IN ES_FAC_UNIT.FAC_CD%TYPE)?is DROP PROCEDURE IF EXISTS `SD_USER_P_ADD_USR`;
create procedure P_ADD_FAC(
???????id_fac_cd? varchar(100))
1.在创建存储过程时如果存在同名的存储过程,会删除老的存储过程.?
? oracle使用create or replace.
? mysql使用先删除老的存储过程,然后再创建新的存储过程.
2. oracle 存储过程可以定义在package中,也可以定义在Procedures中. 如果定义在包中,一个包中可以包含多个存储过程和方法.如果定义在Procedures中,存储过程中不可以定义多个存储过程.?
?? Mysql? 存储过程中不可以定义多个存储过程.?
3. oracle中字符串类型可以使用varchar2.??
?? Mysql 需要使用varchar
4. Oracle中参数varchar长度不是必须的,
?? Mysql中参数varchar长度是必须的,比如varchar(100)? 2 创建函数语句不同 CREATE OR REPLACEFUNCTION F_ROLE_FACS_GRP(
???? ii_role_int_key IN SD_ROLE.ROLE_INT_KEY%TYPE
??? )?RETURN?VARCHAR2 DROP FUNCTION IF EXISTS `SD_ROLE_F_ROLE_FACS_GRP`;
CREATE? FUNCTION `SD_ROLE_F_ROLE_FACS_GRP`(
?ii_role_int_key INTEGER(10)
)?RETURNS?varchar(1000)? 1.在创建函数时如果存在同名的函数,会删除老的函数.??
? oracle使用create or replace.
? mysql使用先删除老的函数,然后再创建新的函数.
2. oracle 函数可以定义在package中,也可以定义在Functions中. 如果定义在包中,一个包中可以包含多个存储过程和函数.如果定义在Functions中,每个函数只能定义一个函数.
?? Mysql? Functions不可以定义多个函数.?
3.? oracle返回值用return.?
??? Mysql返回值用returns.? 3 传入参数写法不同 procedure P_ADD_FAC(
???id_fac_cd? IN ES_FAC_UNIT.FAC_CD%TYPE) create procedure P_ADD_FAC(
?????(in) id_fac_cd? varchar(100))
1. oracle存储过程参数可以定义为表的字段类型.
?? Mysql存储过程不支持这种定义方法.需要定义变量的实际类型和长度.
2. oracle 参数类型in/out/inout写在参数名后面.?
?? Mysql? 参数类型in/out/inout写在参数名前面.
3. oracle 参数类型in/out/inout 都必须写.
?? Mysql? 参数类型如果是in,则可以省略. 如果是out或inout则不能省略.
注意: mysql中指定参数为IN,OUT,或INOUT 只对PROCEDURE是合法的。(FUNCTION参数总是被认为是IN参数) RETURNS字句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。?? function func_name(
???????????gw_id? in(out)? varchar2?) create function func_name(
???????gw_id varchar(100)) 4 包的声明方式 create or replace package/package body package name 拆分成多个存储过程或函数 oracle可以创建包,包中可以包含多个存储过程和方法.?
mysql没有没有包这个概念,可以分别创建存储过程和方法. 每个存储过程或方法都需要放在一个文件中.?
例1: 方法命名?
oracle 中SD_FACILITY_PKG.F_SEARCH_FAC?
to mysql SD_FACILITY_F_SEARCH_FAC?
例2: 过程命名
oracle 中SD_FACILITY_PKG.P_ADD_FAC
to mysql SD_FACILITY_P_ADD_FAC?
5 存储过程返回语句不一样 return; LEAVE proc; (proc?代表最外层的begin end) oracle存储过程和方法都可以使用return退出当前过程和方法.?
Mysql存储过程中只能使用leave退出当前存储过程.不可以使用return.?
Mysql方法可以使用return退出当前方法.? 6 存储过程异常处理不一样 EXCEPTION
??? WHEN OTHERS THEN
??? ROLLBACK ;
??? ov_rtn_msg := c_sp_name||‘(‘|| li_debug_pos ||‘):‘||
??????? TO_CHAR(SQLCODE)||‘: ‘||SUBSTR(SQLERRM,1,100); DECLARE EXIT HANDLER FOR? SQLEXCEPTION?
?BEGIN
??? ROLLBACK ;
??? set ov_rtn_msg = concat(c_sp_name,‘(‘,li_debug_pos,‘):‘,
??????? TO_CHAR(SQLCODE),‘: ‘,SUBSTR(SQLERRM,100));
?END; oracle : 内部异常不需要定义,在存储过程或函数末尾写上EXCEPTION后,后面的部分即为异常处理的部分.? oracle可以定义自定义异常,自定义异常需要使用raise关键字抛出异常后,才可以在EXCEPTION中捕获.

mysql: mysql内部异常也需要先定义,在定义的同时也需要实现异常的功能.?
????????? 目前mysql不支持自定义异常.? 7 过程和函数的声明变量的位置不同 声明变量在begin…end体之前 声明变量在begin...end体内,begin之后其他任何内容之前   8 NO_DATA_FOUND异常处理 ?EXCEPTION
??????? WHEN NO_DATA_FOUND THEN
??????????? oi_rtn_cd := 1;
??????????? ov_rtn_msg := SD_COMMON.P_GET_MSG(‘DP-CBM-01100a-016‘,
???????????????????????????????????????????????? li_sub_rtn_cd,
???????????????????????????????????????????????? lv_sub_rtn_msg
???????????????????????????????????????????????? ); 使用FOUND_ROWS()代替NO_DATA_FOUND. 详见注释. oracle中:?
NO_DATA_FOUND是游标的一个属性.?
当select没有查到数据就会出现 no data found 的异常,程序不会向下执行.

Mysql:?
没有NO_DATA_FOUND这个属性.但可是使用FOUND_ROWS()方法得到select语句查询出来的数据.如果FOUND_ROWS()得到的值为0,就进入异常处理逻辑.? 9 在存储过程中调用存储过程方式的不同 Procedure_Name(参数); Call Procedure_Name(参数); MYSQL存储过程调用存储过程,需要使用Call pro_name(参数).??
Oracle调用存储过程直接写存储过程名就可以了.? 10 抛异常的方式不同 RAISE Exception_Name; 见备注 详见<<2009002-OTMPPS-Difficult Questions-0001.doc>>中2.5 Mysql异常处理部分 ?
  • 触发器
编号 类别 ORACLE MYSQL 注释 1 创建触发器语句不同 create or replace?trigger TG_ES_FAC_UNIT
??before insert or update or delete?on ES_FAC_UNIT
? for each row create?trigger `hs_esbs`.`TG_INSERT_ES_FAC_UNIT`?BEFORE INSERT?on `hs_esbs`.`es_fac_unit`?
for each row? 1. Oracle使用create or replace trigger语法创建触发器.
?? Mysql使用 create trigger创建触发器.
2. Oracle可以在一个触发器触发insert,delete,update事件.?
?? Mysql每个触发器只支持一个事件. 也就是说,目前每个trigger需要拆分成3个mysql trigger.
3. mysql trigger 不能在客户端显示或编辑.需要在服务器所在的机器上操作.? 2 触发器new和old记录行的引用不同 取得新数据:?:new.FAC_CD
取得老数据:?:old.FAC_CD 取得新数据:?NEW.FAC_CD
取得老数据:?OLD.FAC_CD 1. new和old记录行的引用:
?? mysql是NEW.col1,OLD.col1来引用。
?? oracle是:NEW.col1,:OLD.col1来引用。
2. NEW 和OLD不区分大小写.? ?
  • 用户权限
编号 类别 ORACLE MYSQL 注释 1 创建用户 Create user user_name identified by user_password?
default tablespace starSpace temporary tablespace temp; CREATE USER user_name IDENTIFIED BY user_password; 1.oracle创建用户
Oracle 的默认用户有三个: sys / system / scott. 其中sys和system 是系统用户,拥有dba权限,scott用户是Oracle数据库的一个示范账户,在数据库安装时创建,不具备dba权限.?
创建用户命令:?
Create user user_name identified by user_password?
[default tablespace tableSpace]?
[temporary tablespace tableSpace};?
说明:?
每个用户都有一个默认表空间和一个临时表空间,如果没有指定,oracle就将system设置为默认表空间,将temp设为临时表空间.?

2.mysql创建用户
创建用户命令:?
mysql> CREATE USER yy IDENTIFIED BY ‘123‘;?
yy表示你要建立的用户名,后面的123表示密码
上面建立的用户可以在任何地方登陆。
如果要限制在固定地址登陆,比如localhost 登陆:
mysql> CREATE USER [email?protected] IDENTIFIED BY ‘123‘; 2 删除用户 Drop user user_name cascade; Drop user user_name; 1. Oracle
SQL>drop user 用户名;? //用户没有建任何实体
SQL> drop user 用户名 CASCADE;? // 将用户及其所建实体全部删除
注: 当前正连接的用户不得删除。

2. Mysql
自4.1.1以后,删除一个MYSQL帐户,可以使用drop user 语句了。
不过在5.0.2之前的版本中,drop user语句只能删除没有任何权限的用户。
从5.0.2往后的版本中,drop user语句可以删除任何用户。(当然不能自己删自己)。示例:drop user "garfield"@"localhost"。别忘了加后面的@,不然会报错。

在4.1.1与5.0.2之间的版本中要删除一个MYSQL帐户,需要进行以下操作。
1) 使用show grants语句查看要删除的MYSQL帐户都有哪些权限,使用方法如show grants for "garfield"@"localhost"。
2) 使用revoke语句收回用户在show grants里拥有的权限。执行这个语句将删除除user表之外的其它所有权限表中的相关记录,并且收回在user表中该用户拥有的全局权限。
3) 使用drop user 语句把用户从user表中删除。 3 修改密码 alter user user_name identified by new_password
mysqladmin -u root -p 123456 password "your password"; 1.mysql修改密码
第一种方式:
  1) 更改之前root没有密码的情况
    c:mysqlbin>mysqladmin -u root password "your password"
2) 更改之前root有密码的情况,假如为123456
  c:mysqlbin>mysqladmin -u root -p123456 password "your password"
  注意:更改的密码不能用单引号,可用双引号或不用引号
第二种方式:
 1) c:mysqlbin>mysql -uroot -p密码 以root身份登录
 2) mysql>use mysql 选择数据库
 3) mysql>update user set password=password(‘你的密码‘) where User=‘root‘;
 4) mysqlflush privileges; 重新加载权限表 4 设置用户权限 Grant connect to star? -- star角色允许用户连接数据库,并创建数据库对象
Grant resource to star? -- star角色允许用户使用数据库中的存储空间.?
Grant dba to star??? -- DBA权限 GRANT ALL ON picture.* TO test IDENTIFIED BY "test"; 1. 详见<<oracle vs mysql 用户权限.doc>>? 2.1 Oracle 权限设置?
2. 详见<<oracle vs mysql 用户权限.doc>>? 1.4 用户权限设置 5 回收权限 Revoke select,update on product from user02; REVOKE privileges (columns) ON what FROM user 1. Oracle
?? Revoke语句的基本格式如下:
?? REVOKE 权限类型 [(字段列表)] [,权限类型 [(字段列表)]…]ON {数据库名称.表名称}FROM 用户名@域名或IP地址
例如,管理员撤销用户[email?protected]对数据库xsxk所拥有的创建、创建数据库及表的权限,并撤销该用户可以把自己所拥有的权限授予其他用户的权限,可使用以下命令。
mysql>revoke create,drop on xsxk.* from [email?protected];
mysql>revoke grant option on xsxk.* from [email?protected];
revoke语句中的“用户名@域名或IP地址”部分必须匹配原来grant语句中的“用户名@域名或IP地址”部分,而“权限类型”部分可以是所授权的一部分权限。而且,revoke只能撤销权限,不能删除用户账户,在授权表user中仍保留该用户的记录;用户仍可以连接到数据库服务器。如果要完全删除用户,则使用前面提到的delete语句从user表中删除该用户记录。

2. Mysql
要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了TO用FROM取代并且没有INDETIFED BY和WITH GRANT OPTION子句:
REVOKE privileges (columns) ON what FROM user?
user部分必须匹配原来GRANT语句的你想撤权的用户的user部分。privileges部分不需匹配,你可以用GRANT语句授权,然后用REVOKE语句只撤销部分权限。?
REVOKE语句只删除权限,而不删除用户。即使你撤销了所有权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。要完全删除一个用户,你必须用一条Delete语句明确从user表中删除用户记录 ?
  • 其它
编号 类别 ORACLE MYSQL 注释 1 内连接的更改

(编辑:济宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

?

  • 循环语句
热点阅读