Oracle,oracle转成mysql

本文介绍了如何处理Oracle数据库导出的dmp文件在不同版本间导入时遇到的头部验证失败问题,提供了Oracle登录命令的详细步骤。同时,文章对比了Oracle和MySQL在查询、日期处理、字符串拼接及特定函数(如decode())的差异,为数据库迁移提供了实用的转换方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将oracle 11g导出的dmp文件导入到oracle10g 

问题:从数据库从导出的数据,接着进行导入数据操作,提示:

IMP-00010: 不是有效的导出文件, 头部验证失败
IMP-00000: 未成功终止导入

从网上查阅,头部验证失败是由于版本号不同所致,经试验可以

通过如下方法进行修改:用notepad++工具打开dmp文件,可以看到头部信

息 --TEXPORT:V11.01.00,即为源数据库的版本号,将其修改为目的数

据库的版本号,如本机为10.02.01,再次进行导入操作,导入成功

Oracle登录命令

1、运行SQLPLUS工具

  C:\Users\wd-pc>sqlplus

2、直接进入SQLPLUS命令提示符

  C:\Users\wd-pc>sqlplus /nolog

3、以OS身份连接 

  C:\Users\wd-pc>sqlplus / as sysdba   或

  SQL>connect / as sysdba

4、普通用户登录

  C:\Users\wd-pc>sqlplus scott/123456  或

  SQL>connect scott/123456  或

  SQL>connect scott/123456@servername

5、以管理员登录

  C:\Users\wd-pc>sqlplus sys/123456 as sysdba 或

  SQL>connect sys/123456 as sysdba

6、切换用户

  SQL>conn hr/123456 

  注:conn同connect

 7、退出

  exit

删除oracle用户: SQL>drop user username cascade; (删除与用户相关的所有对象)

--1.查看所有用户:

select * from dba_users;

select * from all_users;

select * from user_users;

--2.查看用户或角色系统权限(直接赋值给用户或角色的系统权限):

select * from dba_sys_privs;

select * from user_sys_privs;

--3.查看角色(只能查看登陆用户拥有的角色)所包含的权限

sql>select * from role_sys_privs;

--4.查看用户对象权限: select * from dba_tab_privs;

select * from all_tab_privs;

select * from user_tab_privs;

--5.查看所有角色: select * from dba_roles;

--6.查看用户或角色所拥有的角色: select * from dba_role_privs;

select * from user_role_privs;

--7.查看哪些用户有sysdba或sysoper系统权限(查询时需要相应权限)

select * from V$PWFILE_USERS --注意:  

--1、以下语句可以查看Oracle提供的系统权限 select name from sys.system_privilege_map

--2、查看一个用户的所有系统权限(包含角色的系统权限) SELECT privilege FROM dba_sys_privs WHERE grantee = 'DATAUSER' UNION SELECT privilege FROM dba_sys_privs WHERE grantee IN (SELECT granted_role FROM dba_role_privs WHERE grantee = 'DATAUSER');

1、先查询空闲空间 select tablespace_name,file_id,block_id,bytes,blocks from dba_free_space; 2、增加Oracle表空间 先查询数据文件名称、大小和路径的信息,语句如下: select tablespace_name,file_id,bytes,file_name from dba_data_files;

3、修改文件大小语句如下 alter database datafile '需要增加的数据文件路径,即上面查询出来的路径 'resize 800M;

4、创建Oracle表空间

create tablespace test datafile '/home/app/oracle/oradata/oracle8i/test01.dbf' size 8M

autoextend on

next 5M maxsize 10M;

create tablespace sales

datafile '/home/app/oracle/oradata/oracle8i/sales01.dbf' size 800M

autoextend on

next 50M

maxsize unlimited

maxsize unlimited 是大小不受限制

create temporary tablespace sales

tempfile '/home/app/oracle/oradata/oracle8i/sales01.dbf' size 800M

autoextend on

next 50M

maxsize 1000M

创建本地管理临时表空间,如果是临时表空间,所有语句中的datafile都换为tempfile ,所有语句中的datafile都换为tempfile8i

mysql查询取整数或小数或精确位数

select cast(19.16558 as decimal(9,2))精确到几位
select round(123.5); 四舍五入
select floor(123.5);取整数部分
select ceil(123.5);四舍五入

decode()oracle函数在mysql中转化

decode()是oracle数据库的一种函数,类似于java中if三目运算,在mysql中是没有decode()函数的,但mysql中可以用if语句来代替,长话短说,举个例子就很明白了:

我们首先看一下java中三目运算:

     int i=(4>3)?4:3;

     其中    (4>3)?4:3   java if三目运算

decode()在oracle 表示:

      decode(node_count ,null, 0, 1)
转换成mysql   语句 if:

      if(node_count=null,0,1)
  转换成mysql  case when 语句:

    (case when node_count=null then 0 else 1 end)

case xxx when xx then xxx when xx then xxx end


2.oracle 中的sysdate显示系统时间 mysql 有sysdate()函数获取时间

Oracle to_char函数的功能是将数值型或者日期型转化为字符型,

to_date 是日期装换

对于MySQL

是用的是cast(s as type)这种函数装换类型

如:转换char类型的 cast(s as char)

即使to_char(s)对应cast(s as char)

但是在MySQL中

要讲日期转为字符的,不可以用cast,有一个函数可以使用

date_format(date,'%Y-%m-%d')——对应—–>oracle中的to_char(date,yyyy-mm-dd);

str_to_date(date,'%Y-%m-%d')——对应—–>oracle中的to_date(date,yyyy-mm-dd);

要注意一下,%Y表示有4为的日期,比如2018, %m是数据月份,%d是日期
mysql 类似to_char() to_date()函数 
  mysql日期和字符相互转换方法 
  date_format(date,'%Y-%m-%d') -------------->oracle中的to_char(); 
  str_to_date(date,'%Y-%m-%d') -------------->oracle中的to_date(); 
  %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) 
  %S:代表 秒,格式为(00……59) 
  %s:代表 秒,格式为(00……59) 
  SELECT DATE_FORMAT(20130111191640,'%Y-%m-%d %H:%i:%s') 
  DATE_FORMAT(20130111191640,'%Y-%m-%d %H:%i:%s')

3.oracle中的(+)是一种特殊的用法,(+)表示外连接,并且总是放在非主表的一方。

例如

左外连接:select A.a,B.a from A LEFT JOIN B ON A.b=B.b;

等价于select A.a,B.a from A,B where A.b = B.b(+);

再举个例子,这次是右外连接:select A.a,B.a from A RIGHT JOIN B ON A.b=B.b;

等价于select A.a,B.a from A,B where A.b (+) = B.b;

oracle

nvl(xxx,0)  转成   mysql      ifnull(xxx,0)

select sysdate from dual    转成   mysql      select now()

sys_guid()函数  select newid() from dual    转成   mysql    UUID()

oracle   的  to_number    mysql  不需要

Oracle trunc()函数的用法

/**************日期********************/

1.select trunc(sysdate) from dual  --2011-3-18  今天的日期为2011-3-18

2.select trunc(sysdate, 'mm')   from   dual  --2011-3-1    返回当月第一天.

3.select trunc(sysdate,'yy') from dual  --2011-1-1       返回当年第一天

4.select trunc(sysdate,'dd') from dual  --2011-3-18    返回当前年月日

5.select trunc(sysdate,'yyyy') from dual  --2011-1-1   返回当年第一天

6.select trunc(sysdate,'d') from dual  --2011-3-13 (星期天)返回当前星期的第一天

7.select trunc(sysdate, 'hh') from dual   --2011-3-18 14:00:00   当前时间为14:41

8.select trunc(sysdate, 'mi') from dual  --2011-3-18 14:41:00   TRUNC()函数没有秒的精确

9. trunc(125.815) would return 125   截取少数点前面的数值

mysql

NOW()函数以'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。

CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE字段中。

CURTIME()以'HH:MM:SS'的格式返回当前的时间,可以直接存到TIME字段中。

取任意一个月的天数:日期可以从前台传入

select substr(last_day(date_format(20220401,'%Y-%m-%d')),9)

日期加一天

select DATE_ADD(t.voucher_date, INTERVAL 1 DAY) from tcc_voucher_date t 

-- 将dept 表中的数据按‘OPERATIONS’、‘ACCOUNTING’、‘SALES’ 进行自定义排序 SELECT deptno, dname, loc FROM dept ORDER BY DECODE(dname, 'OPERATIONS', 1, 'ACCOUNTING', 2, 'SALES', 3); -- Oracle 中用法

SELECT deptno, dname, loc FROM dept ORDER BY CASE dname WHEN 'OPERATIONS' THEN 1 WHEN 'ACCOUNTING' THEN 2 WHEN 'SALES' THEN 3 END ;  -- mysql中用法

mysql 字符串拼接的几种方式 

第一种:

mysql自带语法CONCAT(string1,string2,...),此处是直接把string1和string2等等的字符串拼接起来(无缝拼接哦)

说明:此方法在拼接的时候如果有一个值为NULL,则返回NULL

如:

1.SELECT CONCAT("name=","lich",NULL) AS test;

2.SELECT CONCAT("name=","lich") AS test;

第二种:
第二种也是mysql自带语法CONCAT_WS(separator,string1,string2,...),但是可以多个字符串用指定的字符串进行拼接(带缝拼接哦)

说明:string1,string2代表的是字符串,而separator代表的是连接其他参数的分隔符,可以是符号,也可以是字符串。如果分隔符为NULL,则结果为NULL。此方法参数可以为NULL。

如:

1.select concat_ws('#','name=','lich',null) AS test;

2.select concat_ws(NULL,'name=','lich',null) AS test;

3.select concat_ws("hello,",'name=','lich',null) AS test;

第三种:

也是mysql的自带语法GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

如:

1.SELECT id,GROUP_CONCAT(type) FROM log_sys_interview GROUP BY type ;

2.SELECT id,GROUP_CONCAT(type Separator '#') FROM log_sys_interview GROUP BY type ; 

 

3.SELECT id,GROUP_CONCAT(type ORDER BY type DESC) FROM log_sys_interview GROUP BY ip ;

4.SELECT id,GROUP_CONCAT(DISTINCT type ORDER BY type DESC) FROM log_sys_interview GROUP BY ip ;

oracle中substr() instr() 用法

substr函数格式   (俗称:字符截取函数)
  格式1: substr(string string, int a, int b);

  格式2:substr(string string, int a) ;

解析:

    格式1:
        1、string 需要截取的字符串
        2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
        3、b 要截取的字符串的长度

    格式2:
        1、string 需要截取的字符串
        2、a 可以理解为从第a个字符开始截取后面所有的字符串。

2、实例解析
格式1:

1、select substr('HelloWorld',0,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
2、select substr('HelloWorld',1,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
3、select substr('HelloWorld',2,3) value from dual; //返回结果:ell,截取从“e”开始3个字符
4、select substr('HelloWorld',0,100) value from dual; //返回结果:HelloWorld,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。
5、select substr('HelloWorld',5,3) value from dual; //返回结果:oWo
6、select substr('Hello World',5,3) value from dual; //返回结果:o W (中间的空格也算一个字符串,结果是:o空格W)
7、select substr('HelloWorld',-1,3) value from dual; //返回结果:d (从后面倒数第一位开始往后取1个字符,而不是3个。原因:下面红色 第三个注解)
8、select substr('HelloWorld',-2,3) value from dual; //返回结果:ld (从后面倒数第二位开始往后取2个字符,而不是3个。原因:下面红色 第三个注解)
9、select substr('HelloWorld',-3,3) value from dual; //返回结果:rld (从后面倒数第三位开始往后取3个字符)
10、select substr('HelloWorld',-4,3) value from dual; //返回结果:orl (从后面倒数第四位开始往后取3个字符)

 格式2:

11、select substr('HelloWorld',0) value from dual;  //返回结果:HelloWorld,截取所有字符
12、select substr('HelloWorld',1) value from dual;  //返回结果:HelloWorld,截取所有字符
13、select substr('HelloWorld',2) value from dual;  //返回结果:elloWorld,截取从“e”开始之后所有字符
14、select substr('HelloWorld',3) value from dual;  //返回结果:lloWorld,截取从“l”开始之后所有字符
15、select substr('HelloWorld',-1) value from dual;  //返回结果:d,从最后一个“d”开始 往回截取1个字符
16、select substr('HelloWorld',-2) value from dual;  //返回结果:ld,从最后一个“d”开始 往回截取2个字符
17、select substr('HelloWorld',-3) value from dual;  //返回结果:rld,从最后一个“d”开始 往回截取3个字符 

注:当只有两个参数时;不管是负几,都是从最后一个开始 往回截取(如:15、16、17)

instr函数格式

--instr(源字符串,目标字符串,起始字符串,匹配字符串)=返回要截取的字符串在源字符串中的位置,从字符的开始,只检索一次
--instr(string1,string2,index1,index2) 表示:要在string1的index1号位置,开始查找,第index2次,出现的string2
select instr('miaoying','i',2,2) from dual;--返回6:也就是说:在"miaoying"的第2号位置开始,查找第二次出现的i的位置
select instr('miaoying','k',2,2)from dual;--返回0:即如果查找不到,则返回0
select instr('miaoying','i') from dual;--返回2
select instr('miaoying','yi') from dual;--返回5:即"yi"的y的位置
select instr('miaoying','i',-1,2) from dual;--返回2:
--空格也是字符。。。。。
 
select * from omgnode a where name like '%miaoying%'
select * from omgnode a where instr(name,'miaoying')>0--效果一样

INITCAP
返回字符串并将字符串的第一个字母变为大写;

upper:小写字符转化成大写的函数

lower:大写字符转化成小写的函数 

Choose two
Examine the data in the CUST NAME column of the CUSTOMERS table:
CUST_NAME
------------------------------
Renske Ladwig
Jason Mallin
Samuel McCain
Allan MCEwen
Irene Mikkilineni
Julia Nayer
You want to display the CUST_NAME values where the last name starts with Mc or MC.
Which  WHERE clauses give the required result?
A) WHERE INITCAP (SUBSTR(cust_name, INSTR(cust_name,' ') +1 ) ) IN ('MC%', 'Mc%)
B) WHERE UPPER (SUBSTR(cust_nane, INSTR(cust_name, ' ') +1 ) ) LIKE UPPER('MC%')
C) WHERE INITCAP(SUBSTR(cust_nane, INSTR(cust_name,' ') +1 ) ) LIKE 'Mc%'
D) WHERE SUBSTR(cust_name,INSTR(cust_name,' ') +1 ) LIKE 'Mc%' OR 'MC%'
E) WHERE SUBSTR(cust_name, INSTR(cust_name,' ') +1 ) LIKE 'Mc%'
(解析: Answer:BC。注意 instr 和 substr 的用法,没有实验还是很难理解的。

截取小数点后面的数值

select substr('123.456400',INSTR('123.456400','.')+1,2) from dual    返回   45
select substr('123.456400',INSTR('123.456400','.')) from dual    返回   .456400

过滤同一个表中多个字段重复数据的SQL技巧

方法一:
SELECT CODE,NAME,COUNT(*) AS [COUNT],MAX(ID) AS ID
FROM TEST
GROUP BY CODE,NAME HAVING COUNT(*) > 1
方法二:
SELECT * FROM (SELECT NAME,CODE,(SELECT COUNT(*) FROM TEST WHERE NAME=A.NAME AND CODE=A.CODE ) AS [COUNT],MAX(ID) AS ID
FROM TEST A
GROUP BY NAME,CODE) RES
WHERE [COUNT] > 1

mysql datediff() 函数的使用方法

mysql计算两个日期之间的天数

mysql> select datediff('2021-06-10','2021-06-08');
+-------------------------------------+
| datediff('2021-06-10','2021-06-08') |
+-------------------------------------+
|                                   2 |
+-------------------------------------+
1 row in set (0.01 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值