MYSQL 与 ORACLE 用法区别

MYSQL 与 ORACLE 用法区别

日期格式

MYSQL

%Y:年,4 位
%y:年,2 位
%M:月名
%m:月,数值(00-12)
%D:带有英文前缀的月中的天
%d:月的天,数值(00-31)
%e:月的天,数值(0-31)
%H:小时(00-23)
%h:小时(01-12)
%I:小时(01-12)
%i:分钟,数值(00-59)
%S:秒(00-59)
%s:秒(00-59)
%W:星期名
%a:缩写星期名
%b:缩写月名
%c:月,数值
%f:微秒
%j:年的天 (001-366)
%k:小时 (0-23)
%l:小时 (1-12)
%p:AM 或 PM
%r:时间,12-小时(hh:mm:ss AM 或 PM)
%T:时间, 24-小时 (hh:mm:ss)
%U:周 (00-53) 星期日是一周的第一天
%u:周 (00-53) 星期一是一周的第一天
%V:周 (01-53) 星期日是一周的第一天,与 %X 使用
%v:周 (01-53) 星期一是一周的第一天,与 %x 使用
%w:周的天 (0=星期日, 6=星期六)
%X:年,其中的星期日是周的第一天,4 位,与 %V 使用
%x:年,其中的星期一是周的第一天,4 位,与 %v 使用

ORACLE

格式:显示值:
Yearyytwo digits 两位年21
Yearyyythree digits 三位年021
Yearyyyyfour digits 四位年2021
Monthmmnumber 两位月11
Monthmonabbreviated 字符集表示11月,若是英文版,显示nov
Monthmonthspelled out 字符集表示11月,若是英文版,显示november
Dayddnumber 当月第几天02
Daydddnumber 当年第几天02
Daydyabbreviated 当周第几天简写星期五,若是英文版,显示fri
Daydayspelled out 当周第几天全写星期五,若是英文版,显示friday
Dayddspthspelled out, ordinal twelfth
Hourhhtwo digits 12小时进制01
Hourhh24two digits 24小时进制13
Minutemitwo digits 60进制45
Secondsstwo digits 60进制25
其它Qdigit 季度4
其它WWdigit 当年第几周44
其它Wdigit 当月第几周1

connect by start with

1、mysql没有层级查询方法 而 oracle通过connect by start with语法可以实现层级查询
2、mysql实现层级查询的方式很多,有使用存储过程函数嵌套调用亦有使用临时表进行层级查询

要求:
一个字段里存放多个客户信息,多个客户信息中间用‘|#END#|’分割,每个客户信息按照 名称,个人/机构标志,证件类型,证件号码,证件有效期,电话号码,电子邮箱存放客户数据并用‘|’符号分割。将所有客户的所有基本信息查询出来。

MYSQL写法:
SELECT
	SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,1) AS BENE_NAME,
	SUBSTRING_INDEX(SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,2),IN_INDEX2,-1) AS BENE_CUST_TYPE,
	SUBSTRING_INDEX(SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,3),IN_INDEX2,-1) AS BENE_CERT_TYPE,
	SUBSTRING_INDEX(SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,4),IN_INDEX2,-1) AS BENE_CERT_NO,
	SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,5),IN_INDEX2,-1),1,POSITION(' ' IN SUBSTRING_INDEX(SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,5),IN_INDEX2,-1))-1) AS BENE_VALID_DT,
	SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,5),IN_INDEX2,-1),POSITION(' ' IN SUBSTRING_INDEX(SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,5),IN_INDEX2,-1))+1) AS BENE_INVALID_DT,
	SUBSTRING_INDEX(SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,6),IN_INDEX2,-1) AS BENE_TEL,
	SUBSTRING_INDEX(T.IN_STR,IN_INDEX2,-1) AS BENE_EMAIL
FROM (
	SELECT 
		SUBSTRING_INDEX(SUBSTRING_INDEX(@TO_STR,@TO_INDEX,HELP_TOPIC_ID+1),@TO_INDEX,-1) AS IN_STR, 
		@TO_INDEX AS IN_INDEX, 
		@TO_INDEX2 AS IN_INDEX2 , 
		(HELP_TOPIC_ID + 1) AS HELP_TOPIC_ID, 
		@TO_STR 
	FROM 
		MYSQL.HELP_TOPIC, 
		(SELECT @TO_STR := '名称1|个人/机构标志1|证件类型1|证件号码1|证件生效1 证件失效1|电话号码1|电子邮箱1|#END#|名称2|个人/机构标志2|证件类型2|证件号码2|证件生效2 证件失效2|电话号码2|电子邮箱2|#END#|名称3|个人/机构标志3|证件类型3|证件号码3|证件生效3 证件失效3|电话号码3|电子邮箱3|#END#|名称4|个人/机构标志4|证件类型4|证件号码4|证件生效4 证件失效4|电话号码4|电子邮箱4|#END#|', @TO_INDEX := '|#END#|', @TO_INDEX2 := '|') STR 
	WHERE 
		HELP_TOPIC_ID < (LENGTH(@TO_STR) - LENGTH(REPLACE(@TO_STR,@TO_INDEX,'')))/LENGTH(@TO_INDEX) 
	ORDER BY HELP_TOPIC_ID
) T

ORACLE 写法:
SELECT
	REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,1) AS BENE_NAME,
	REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,2) AS BENE_CUST_TYPE,
	REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,3) AS BENE_CERT_TYPE,
	REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,4) AS BENE_CERT_NO,
	SUBSTRING(REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,5),1,POSITION(' ' IN REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,5))-1) AS BENE_VALID_DT,
	SUBSTRING(REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,5),POSITION(' ' IN REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,5))+1) AS BENE_INVALID_DT,
	REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,6) AS BENE_TEL,
	REGEXP_SUBSTR(REGEXP_SUBSTR(REPLACE(IN_STR,'|#END#|',','),'[^,]+',1,ROWNUM),'[^,]+',1,7) AS BENE_EMAIL
FROM (
	SELECT '名称1|个人/机构标志1|证件类型1|证件号码1|证件生效1 证件失效1|电话号码1|电子邮箱1|#END#|名称2|个人/机构标志2|证件类型2|证件号码2|证件生效2 证件失效2|电话号码2|电子邮箱2|#END#|名称3|个人/机构标志3|证件类型3|证件号码3|证件生效3 证件失效3|电话号码3|电子邮箱3|#END#|名称4|个人/机构标志4|证件类型4|证件号码4|证件生效4 证件失效4|电话号码4|电子邮箱4|#END#|' AS IN_STR, '|#END#|' AS IN_INDEX, '|' AS IN_INDEX2
)
CONNECT BY ROWNUM <= LENGTH(REPLACE(IN_STR,IN_INDEX,',')) - LENGTH(REPLACE(REPLACE(IN_STR,IN_INDEX,','),',',''))

执行结果:
执行结果

INSERT

INSERT 忽略重复

mysql
	INSERT IGNORE INTO
	必须是主键重复才能忽略
	只是唯一索引不生效
oracle
1. errlog 重复后会在MY_ERROR_INFO插入一条记录
create table MY_ERROR_INFO
(
    ora_err_number$ NUMBER,
    ora_err_mesg$   VARCHAR2(2000),
    ora_err_rowid$  ROWID,
    ora_err_optyp$  VARCHAR2(2),
    ora_err_tag$    VARCHAR2(2000),
    myid            NUMBER
);
		
INSERT INTO MY_TABLE (COLUMN1, COLUMN2, COLUMN3, COLUMN4, CREATE_TM, CREATOR, MODIFY_TM, MODIFIER)
VALUES ('100001', '幺零零零零幺', 'COM.100001', '1', NULL, NULL, NULL, NULL)
LOG ERRORS INTO MY_ERROR_INFO ( 'MY_TABLE ' ) REJECT LIMIT UNLIMITED;
2. IGNORE_ROW_ON_DUPKEY_INDEX 这个注释有用 主键或者唯一索引都生效
INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(MY_TABLE (COLUMN1, COLUMN2)) */ INTO MY_TABLE
(COLUMN1, COLUMN2, COLUMN3, COLUMN4, CREATE_TM, CREATOR, MODIFY_TM, MODIFIER)
VALUES ('100001', '幺零零零零幺', 'COM.100001', '1', NULL, NULL, NULL, NULL);

INSERT 替换重复行

mysql
	REPLACE INTO
	必须是主键重复才能忽略
	只是唯一索引不生效
oracle

INSERT 更新重复列

mysql
	INSERT INTO ON DUPLICATE KEY UPDATE
	必须是主键重复才能忽略
	只是唯一索引不生效
oracle

索引

索引失效

ORACLE
-- 失效查询监控语句:

-- 普通索引:
SELECT owner, index_name, tablespace_name FROM dba_indexes WHERE status = 'UNUSABLE';
-- 分区索引:
SELECT index_owner, index_name, partition_name, tablespace_name FROM dba_ind_PARTITIONS WHERE status = 'UNUSABLE';
-- 子分区索引:
SELECT index_owner, index_name, partition_name, subpartition_name, tablespace_name FROM dba_ind_SUBPARTITIONS WHERE status = 'UNUSABLE';

-- 对应的批量生成修复脚本:

SELECT 'alter index ' || owner || '.' || index_name ||
       ' rebuild tablespace ' || tablespace_name || ';'
  FROM dba_indexes
 WHERE status = 'UNUSABLE';

SELECT 'alter index ' || index_owner || '.' || index_name ||
       ' rebuild partition ' || PARTITION_NAME || ' TABLESPACE ' ||
       tablespace_name || ';'
  FROM dba_ind_partitions
 WHERE status = 'UNUSABLE';

SELECT 'alter index ' || index_owner || '.' || index_name ||
       ' rebuild subpartition ' || SUBPARTITION_NAME || ' TABLESPACE ' ||
       tablespace_name || ';'
  FROM dba_ind_subpartitions
 WHERE status = 'UNUSABLE';

-- 或者PL/SQL

set serveroutput on size unlimited

BEGIN
  FOR x IN
  (
    SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD ONLINE PARALLEL' comm
    FROM    dba_indexes
    WHERE   status = 'UNUSABLE'
    UNION ALL
    SELECT 'ALTER INDEX '||index_owner||'.'||index_name||' REBUILD PARTITION '||partition_name||' ONLINE PARALLEL'
    FROM    dba_ind_PARTITIONS
    WHERE   status = 'UNUSABLE'
    UNION ALL
    SELECT 'ALTER INDEX '||index_owner||'.'||index_name||' REBUILD SUBPARTITION '||subpartition_name||' ONLINE PARALLEL'
    FROM    dba_ind_SUBPARTITIONS
    WHERE   status = 'UNUSABLE'
  )
  LOOP
    dbms_output.put_line(x.comm);
    EXECUTE immediate x.comm;
  END LOOP;
END;

-- 原文链接:https://blog.csdn.net/kobe24shou/article/details/105428555

查进程锁

MYSQL

查询正在执行的SQL
select * from information_schema.`PROCESSLIST` where info is not null;
show processlist;
-- 1、查询进程
show processlist;
kill id;
-- 2.查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-- 3.查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

ORACLE

查询正在执行的SQL
-- 1、查询Oracle正在执行的sql语句及执行该语句的用户
SELECT b.sid oracleID,  
       b.username Oracle用户,  
       b.serial#,  
       spid 操作系统ID,  
       paddr,  
       sql_text 正在执行的SQL,  
       b.machine 计算机名  
FROM v$process a, v$session b, v$sqlarea c  
WHERE a.addr = b.paddr  
   AND b.sql_hash_value = c.hash_value;

-- 2、查看正在执行sql的发起者的发放程序
SELECT OSUSER 电脑登录身份,
       PROGRAM 发起请求的程序,
       USERNAME 登录系统的用户名,
       SCHEMANAME,
       B.Cpu_Time 花费cpu的时间,
       STATUS,
       B.SQL_TEXT 执行的sql
FROM V$SESSION A
LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS
                   AND A.SQL_HASH_VALUE = B.HASH_VALUE
ORDER BY b.cpu_time DESC

-- 3、查出oracle当前的被锁对象
SELECT l.session_id sid,
       s.serial#,
       l.locked_mode 锁模式,
       l.oracle_username 登录用户,
       l.os_user_name 登录机器用户名,
       s.machine 机器名,
       s.terminal 终端用户名,
       o.object_name 被锁对象名,
       s.logon_time 登录数据库时间
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
ORDER BY sid, s.serial#;

-- 4、kill掉当前的锁对象可以为
alter system kill session 'sid, s.serial#‘;

-- 5、查看当前oracle中正在执行的sql语句——即查询oracle进程的sql
select a.program, b.spid, c.sql_text,c.SQL_ID
from v$session a, v$process b, v$sqlarea c
where a.paddr = b.addr
and a.sql_hash_value = c.hash_value
and a.username is not null;

查看正在执行的语句

查看锁
-- 1、查看锁是否存在
select sess.sid, 
    sess.serial#, 
    lo.oracle_username, 
    lo.os_user_name, 
    ao.object_name, 
    lo.locked_mode 
    from v$locked_object lo, 
    dba_objects ao, 
    v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid; 
-- 2、释放锁				   SID,SERIAL
alter system kill session '1743,3445';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值