功能实现篇(数据库) ---Oracle转MySQL

Oracle 数据如何迁移到MySQL 图文详细教程 先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。点击工具选择数据传输,注意;如果是从Oracle到MySQL,就选中Oracle库,然后在使用数据传输,这个是传输和被传输的关系。... 阅读详情

目录

需求描述

表结构和数据转移

表产生问题及解决方案

字段默认值处理

查看表和列详情语句

Oracle中常用函数的改写

触发器迁移

创建触发器范例

Oracle转MySQL触发器脚本

检查触发器是否漏写

函数和存储过程迁移

创建函数范例

创建存储过程范例

视图迁移

 创建视图范例

序列迁移

MySQL实现Oracle序列

数据库备份

发到客户那遇到的问题及解决

总结


需求描述

    由于客户需要,需要将项目原本用的Oracle数据库转为MySQL,项目涉及到和数据库相关的也都需要进行相应的修改

    本文主要是记录将Oracle数据库中的数据转为MySQL数据库的数据的过程。


表结构和数据转移

    表结构和数据的转移是最基本的,这里使用到的工具是Navicat Premiium,可以使用其自带的工具进行数据传输

    首先分别简历Oracle的数据库连接和MySQL的数据库连接,然后再用工具进行数据传输,如下图

    从上面可以看到由于数据库不同,所以只能进行表之间的数据传输,而视图,函数,存储,触发器等由于语法不同是无法进行直接传输的,因此这些不能直接传输的就需要进行修改,根据MySQL语法要求进行改写、创建,下面会详细讲。

表产生问题及解决方案

  • 由于MySQL中VARCHAR类型的长度最大为255,因此在传输时如果Oracle那边字段长度很大的话会导致报错

    解决方案:根据实际使用中如果不需要这么大的长度可以讲Oracle的对应长度改小点,或者使用其它类型,如TEXT类型

  • 迁移过程中如果报下面这种错,是因为MySQL限制了每次执行插入操作的最大值,需要的话可以将最大值进行修改
1153 - Got a packet bigger than 'max_allowed_packet' bytes With statement

    解决方案:使用MySQL命令窗口执行以下内容来修改信息报的大小,如增大到16M

set global max_allowed_packet = 1024*1024*16
  • 其它类型的报错的话可以根据报错提示进行修改,在此就不一一列举了。
  • 在创建数据库时如果默认排序规则选择了 utf8_general_ci 这种,则在查询和导入时会不区分大小写,导致插入时会因为重复而报错,在查询时会返回多行而报错,如果不注意的话造成的结果会和预期不符,以及导致系统相应功能模块崩溃。

    解决方案:可以使用 utf8_bin 这种排序规则,这样就会大小写敏感,区分大小写了。

  • 在迁移过程中默认值会丢失,需要手动再给赋个默认值,MySQL默认值只支持默认字段类型的值,不支持函数等

    解决方案:为了确保批量修改导致表出错而崩溃,这里选择在Oracle中得到相关数据后在MySQL中进行手动修改

字段默认值处理

    以下脚本是获取表的字段的默认值信息,根据需要可以进行相关修改

-- 以下脚本是用来给MySQL数据库的表字段赋默认值的

BEGIN

  DBMS_OUTPUT.ENABLE(10000000000);
  FOR ITEM IN (SELECT T.COLUMN_NAME,
                      T.TABLE_NAME,
                      T.DEFAULT_LENGTH,
                      T.DATA_DEFAULT,
                      T.DATA_TYPE
                 FROM USER_TAB_COLUMNS T
                WHERE T.DEFAULT_LENGTH IS NOT NULL) LOOP
    IF ITEM.DATA_TYPE = 'NUMBER' OR ITEM.DATA_TYPE = 'FLOAT' THEN
      DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || ITEM.TABLE_NAME ||
                           ' alter column ' || ITEM.COLUMN_NAME ||
                           ' set default ' || ITEM.DATA_DEFAULT || ';');
    ELSIF (ITEM.DATA_TYPE = 'DATE') THEN
      IF INSTR(ITEM.COLUMN_NAME, 'LASTMODIFIEDON') > 0 THEN
        DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || ITEM.TABLE_NAME ||
                             ' MODIFY COLUMN ' || ITEM.COLUMN_NAME ||
                             ' datetime(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT "最后修改时间";');
      ELSIF INSTR(ITEM.COLUMN_NAME, 'CREATEDON') > 0 THEN
        DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || ITEM.TABLE_NAME ||
                             ' MODIFY COLUMN ' || ITEM.COLUMN_NAME ||
                             ' datetime(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间";');
      ELSE
        DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || ITEM.TABLE_NAME ||
                             ' MODIFY COLUMN ' || ITEM.COLUMN_NAME ||
                             ' datetime(0) NULL DEFAULT CURRENT_TIMESTAMP;');
      END IF;
    ELSE
      DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || ITEM.TABLE_NAME ||
                           ' alter column ' || ITEM.COLUMN_NAME ||
                           ' set default ' || ITEM.DATA_DEFAULT || ';');
    END IF;
  
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('');
END;

查看表和列详情语句

-- Oracle 查询语句
SELECT T.* FROM USER_TABLES T;
SELECT T.* FROM USER_TAB_COLUMNS T;

-- MySQL 查询语句
SELECT *
  FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_TYPE = 'base table'
   AND TABLE_SCHEMA = '数据库名'
 ORDER BY TABLE_NAME ASC;
 
SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_SCHEMA = '数据库名'

Oracle中常用函数的改写

    有些在Oracle中能直接使用的函数,在MySQL中没有或者使用方式不一样,为了使原有SQL语句正常执行,则需要在MySQL

    中进行改写、创建,大多数常用函数MySQL中也都有,只是使用方法不一样,可以创建个函数直接调用MySQL的函数就行,

    其它特殊的函数则需要特殊处理,比如to_char,to_date,to_number等,由于MySQL中不支持函数的重载,所需要注意传参和

    返回值类型,可以进行 case when 进行判断然后做相应的处理,还可以抛个异常方便及时处理,以保证函数的通用性健壮性

    MySQL中不支持 || 进行字符串拼接,需要改成CONCAT()函数进行拼接,一个可拼接多个字符串,用 ,分割,当然为了保证

    SQL语句的通用性,可以两个两个字符串拼接,使用多个CONCAT()进行拼接

    对于DECODE() 函数,这个没有好的解决办法,创建这个函数的在实际使用中也达不到要求,因此都改成了 case when 语法

触发器迁移

  • MySQL不支持CREATE OR REPLACE TARIGGER "XXX",可以通过 DROP TRIGGER IF EXISTS XXX 来创建
  • MySQL触发器的触发条件一次只能有一个,不像Oracle中那样可以 BEFORE INSERT OR UPDATE OR DELETE ON XXX
  • MySQL中的 new 和 old 用法是 new.xxx 和 old.xxx ,和Oracle的区别是前面不加 :号
  • 字段引号要用左上角~这个键的`号,而不是英文的单引号,不然会提示1064错误
  • 进行更新操作后的新老数据赋值不能直接使用 = 号,需要使用 SET 进行赋值,如:SET new.xxx = 'xxx';

创建触发器范例

DELIMITER $$
DROP TRIGGER IF EXISTS TRG_SYNCROLERIGHT_DELETE $$

CREATE TRIGGER TRG_SYNCROLERIGHT_DELETE
  BEFORE DELETE ON TSYS_ROLE_RIGHT
  FOR EACH ROW
BEGIN
DECLARE V_GROUPID VARCHAR(64);
    SELECT P.L_GROUPID
      INTO V_GROUPID
      FROM HSI_GROUP P
       WHERE P.C_GROUPCODE = OLD.ROLE_CODE;
    IF OLD.RIGHT_FLAG <> 2 THEN
      DELETE FROM HSI_GROUPRIGHT
       WHERE C_SYSNAME = 'XXX'
         AND L_GROUPID = V_GROUPID
         AND C_RIGHTCODE = OLD.SUB_TRANS_CODE;
    END IF;
END $$
DELIMITER ;

Oracle转MySQL触发器脚本

DECLARE

  -- 输入触发器的拥有者即可获得MySQL创建触发器所用的脚本,仅供简单的触发器做参考,复杂的还是需要手动调整
  TRIGGER_OWNER VARCHAR(1000) := 'ATS';

  TRIGGER_NAME VARCHAR2(64);

  SQLT CLOB;

  ERRORTEXT VARCHAR2(200);

BEGIN

  DBMS_OUTPUT.ENABLE(1000000000);

  FOR ITEM IN (SELECT T.TRIGGER_NAME
                 FROM ALL_TRIGGERS T
                WHERE T.OWNER = TRIGGER_OWNER
                GROUP BY T.TRIGGER_NAME
                ORDER BY T.TRIGGER_NAME DESC) LOOP
  
    DBMS_OUTPUT.PUT_LINE('-- ' || ITEM.TRIGGER_NAME);
  
    BEGIN
      SELECT ('CREATE ' || REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE((LISTAGG(TEXT,
                                                                                                    '*')
                                                                                            WITHIN
                                                                                            GROUP(ORDER BY LINE)),
                                                                                           '"',
                                                                                           ''),
                                                                                   'ATS.',
                                                                                   ''),
                                                                           'declare',
                                                                           ''),
                                                                   'IF UPDATING THEN',
                                                                   ''),
                                                           ':',
                                                           ''),
                                                   'end if;',
                                                   ''),
                                           CHR(10),
                                           ''),
                                   '*',
                                   '')) TEXT
        INTO SQLT
        FROM USER_SOURCE
       WHERE NAME = ITEM.TRIGGER_NAME;
    
      DBMS_OUTPUT.PUT_LINE(SQLT);
      DBMS_OUTPUT.PUT_LINE('');
    EXCEPTION
    
      WHEN OTHERS THEN
      
        ERRORTEXT := SUBSTR(SQLERRM, 1);
      
        DBMS_OUTPUT.PUT_LINE(ERRORTEXT);
    END;
  
  END LOOP;

END;

检查触发器是否漏写

-- MySQL中执行
SELECT T.TRIGGER_NAME
  FROM INFORMATION_SCHEMA. TRIGGERS AS T
 WHERE T.TRIGGER_SCHEMA = '数据库名称';
 
 -- 将上面结果复制到下面即可查看有哪些触发器没有创建 --
 
-- Oracle中执行
 SELECT T.TRIGGER_NAME
  FROM ALL_TRIGGERS T
 WHERE T.OWNER = 'ATS'
   AND NOT INSTR('上面的查询结果', T.TRIGGER_NAME) > 0;

函数和存储过程迁移

  • 同样没有 CREATE OR REPLACE 语法,可以使用 DROP FUNCTION/PROCEDURE IF EXISTS XXX
  • MySQL中的 DECLARE 变量的定义是在 BEGIN END; 里面
  • 赋值需要执行 SET 或 INTO
  • 返回值的关键字是 RETURNS 而不是 RETURN
  • MySQL中游标(CRUSON)的定义和使用和Oracle略有不同
  • 循环语法也有所不同,可以根据需求选择使用不同的循环方式
  • MySQL中没有 Packages 和 Types,根据需求进行改写

创建函数范例

DELIMITER $$
DROP FUNCTION IF EXISTS f_getdictionarycaption$$

CREATE FUNCTION f_getdictionarycaption (
	var1 VARCHAR (20),
	var2 VARCHAR (20)
) RETURNS VARCHAR (64)
BEGIN

	DECLARE result VARCHAR (64) ;

	IF var1 IS NULL OR var1 = '' THEN
		SET result = '' ;
	ELSE
		SELECT xxx INTO result	FROM DUAL ;
	END IF ; 

	RETURN result ; 
END$$
DELIMITER ;

创建存储过程范例

DELIMITER $$
DROP PROCEDURE IF EXISTS WF_SP_INITDATA$$

CREATE PROCEDURE WF_SP_INITDATA (
	p_table_name VARCHAR (64),
	p_condition VARCHAR (64),
	p_cols VARCHAR (64),
	p_values VARCHAR (64)
) 

label : BEGIN

DECLARE v_l_rowcount INT ;
DECLARE v_vc_table_name VARCHAR (255) ;
DECLARE v_vc_condition VARCHAR (255) ;
DECLARE v_vc_values text ;
DECLARE v_sql text ;

SET v_vc_table_name = p_table_name ;
SET v_vc_condition = p_condition ;
SET v_vc_values = p_values ;

IF v_vc_table_name IS NULL OR v_vc_table_name = '' THEN
	SELECT '表名必须输入' FROM DUAL ; 
	LEAVE label ;
END IF ;

IF v_vc_condition IS NULL OR v_vc_condition = '' THEN
	SELECT '插入数据的条件不能为空' FROM DUAL ; 
	LEAVE label ;
END IF ;

IF v_vc_values IS NULL OR v_vc_values = '' THEN
	SELECT '插入数据的值不能为空' FROM DUAL ;
  LEAVE label ;
END IF ; 

/*判断表是否已经存在*/
SELECT count(1) v_l_rowcount FROM information_schema.tables WHERE table_name = upper(p_table_name) ;
IF v_l_rowcount = 0 THEN
	SELECT CONCAT( '表 ', p_table_name, ' 不存在!' ) FROM DUAL ; 
  LEAVE label ;
END IF ; 

/*判断记录是否已经存在*/
SET v_sql = CONCAT( 'select count(1) from ', v_vc_table_name, ' where ', v_vc_condition ) ; 
SELECT v_sql INTO v_l_rowcount ;

/* 不存在才插入数据*/
IF v_l_rowcount = 0 THEN
  SET v_sql = CONCAT( 'insert into ', v_vc_table_name, p_cols, ' values ', v_vc_values ) ; 
	SELECT v_sql ;
END IF ; 

END$$
DELIMITER ;

视图迁移

  • 视图是可以使用 CREATE OR REPLACE VIEW XXX 语法的
  • MySQL不像Oracle那样支持from子查询,但可以将子查询再建个视图后进行关联使用,需要注意创建的先后顺序
  • 视图中包含 union 的话不要在 as 后加括号
  • MySQL中 Union 的子句不支持 order by
  • MySQL能用 GROUP_CONCAT(xxx SEPARATOR',') 进行行转列

 创建视图范例

create or replace view bs_bank_vl_sub as
select b.urid as bankcode,
               b.name as bankname,
               b.urid as banklevelcode,
               b.urid as parentbanklevelcode,
               '1' as banklevleid,
               '总行' as banklevel,
               b.code as directcode

          from t_banks b
        union
        select tb.urid as bankcode,
               tb.name as bankname,
               tb.code as banklevlelcode,
               b.urid as parentbanklevelcode,
               '2' as banklevelid,
               '分行' as banklevel,
               b.code as directcode
        from t_banklocations tb, t_banks b
         where tb.bankid = b.urid  

序列迁移

  • MySQL中没有序列,有的主键可以用自增长来处理,前提是要知道哪些表的主键可以设为自增长
  • 如果无法设置自增长的话可以模仿Oracle,通过使用序列来实现
  • 可以创建个序列表,分别存着Oracle中的序列名称,当前值,增长值,在创建使用的函数

    为了方便创建序列和初始化数据,可以将下面查询结果导出到excel中,在导入到MySQL中创建的sequence表中,很方便

-- 查询Oracle序列信息
select t.sequence_name,t.last_number,t.increment_by from user_sequences t;

 

MySQL实现Oracle序列

-- 创建表(序列)
drop table if exists sequence;  
create table sequence (  
  seq_name    VARCHAR(50) NOT NULL, -- 序列名称  
  current_value   INT     NOT NULL, -- 当前值  
  increment_value  INT     NOT NULL  DEFAULT 1 -- 步长(跨度)  
);

-- 实现currval的模拟方案 函数使用为:select currval('MovieSeq'); 
DELIMITER $$
DROP FUNCTION IF EXISTS currval $$
create function currval(v_seq_name VARCHAR(50))  
returns integer 
begin 
  declare value integer;  
  set value = 0;  
  select current_value into value  
  from sequence 
  where seq_name = v_seq_name;  
  return value;  
END $$
DELIMITER;

-- 实现nextval的模拟方案 函数使用为:select nextval('MovieSeq');  
DELIMITER $$
DROP FUNCTION IF EXISTS nextval $$
create function nextval (v_seq_name VARCHAR(50))  
returns integer 
begin 
 update sequence 
 set current_value = current_value + increment_value
 where seq_name = v_seq_name;  
 return currval(v_seq_name);  
END $$
DELIMITER ;

-- 增加设置值的函数
DELIMITER $$
DROP FUNCTION IF EXISTS setval $$
create function setval(v_seq_name VARCHAR(50), v_new_value INTEGER)  
returns integer 
begin 
 update sequence 
 set current_value = v_new_value  
 where seq_name = v_seq_name;  
return currval(seq_name);
END $$
DELIMITER ;

数据库备份

    为了避免数据库产生的未知问题或操作而导致无法挽回的结果,可以在测试好后备份一下数据,可以通过导出SQL文件进行

    备份,也可以使用工具自带的备份功能进行备份,如下图

发到客户那遇到的问题及解决

  • 权限问题,由于导出的总的脚本里面包含用户信息(我使用的是root用户),所以会导致客户那边用户不同会报错及权限问题

    解决方式:将导出的脚本中的视图、函数、存储、触发器中的用户信息的sql片段去掉,可以批量替换成空格

  • 视图问题,上面也说了,由于MySQL中不支持from子查询,需要将子查询再创建个子视图,但导出语句中视图的顺序是不同的,导致子视图在后面的话,创建父视图会找不到而报错

    解决方式:手动将脚本中视图那块的语句改为普通的创建语句,并调整好顺序,将子视图放父视图前面,以免报错而中止导入

总结

    本次数据库迁移中遇到的问题及解决让我对Oracle和MySQL的不同有了进一步的了解,以后使用MySQL的企业和用户应该会越来越多,此文章记录下这个过程可以为之后类似的工作做个参考,记录并未涉及全部内容,后续有需要的话可以再新增修改。

附笔记链接:Oracle转MySQL记录

DB(一):数据库概述、SQL概述、Oracle数据类型 包括Oracle、DB2、SQL Server、MySQL数据库概述;数据定义语言DDL、数据操作语言DML、事务控制语言TCL、数据查询语言DQL、数据控制语言DCL语言介绍;NUMBER 、CHAR、VARCHAR2、DATE数据库类型;CHAR和VARCHAR2的存储编码、CHAR和VARCHAR2的最大长度、LONG和CLOB类型。 阅读详情

相关推荐

Oracle数据库数据同步到mysql数据库(Oracle数据库备份dmp如何同步到mysql)

Oracle数据库dmp转mysql格式 一、背景 一项目客户是oracle数据库,需要导一个表数据到自研系统mysql数据库,甲方已给出oracle格式dmp文件! 处理思路: ①、安装Oracle数据库。 ②、用甲方提供oracle格式dmp文件导入我方自搭建的Oracle。 ③、安装一台mysql数据库或使用现成的MySQL数据库。 ④、使用Navicat工具,使用 工具数据传输功能将Oracle数据传输至mysql! 二、安装Oracle数据库。 忽略此步骤,度娘一堆安装教程。 大致就是使用Cent

那个那个 5590

如何将数据从 Oracle 迁移到 MySQL:分步指南

在本文中,我们将探讨如何使用dbForge Studio for MySQL和Devart ODBC driver for Oracle将数据从 Oracle 迁移到 MySQL 表。

励志做最业余的专业博主,控件产品可以私我~ 1万+

Oracle Database Gateways透明网关的安装和配置

在企业里,通常可能有多种数据源,并且他们是异构的。所谓的异构就是说他们是不同的产品,例如: Oracle Database, MS SQL Server, IBM DB2, Sybase ASE, MySQL, Postgre SQL, Excel, XML, Txt或者CSV等用于存放数据的产品或者文件。oracle 透明网关(Transparent gateways)是Oracle连接异构数据库提供的一种技术。

qfjewq的博客 3127

Oracle数据迁移MySQL

现今,Oracle数据迁移MySQL的需求已经越来越普遍,主要的迁移场景大致可以分为三类,第一类是涉及小表以及少量表的一次性迁移,无需进行增量同步,第二类是涉及大表以及多表的一次性迁移,第三类是涉及增量实时同步,而对于数据的迁移方法,常见的方式有使用第三方的同步工具CDC进行Oracle到MySQL的数据迁移、使用开源的同步工具以及应用层面进行迁移同步。

sinat_36757755的博客 1万+

将Oracle数据导入MySQL的几种方法

在数据迁移和集成过程中,经常需要将数据从一个数据库系统(如Oracle)导入到另一个数据库系统(如MySQL)。以上是几种常用的方法,用于将Oracle数据导入到MySQL数据库中。另一种常见的方法是使用编程语言(如Java、Python等)和相应的数据库API来实现数据导入操作。编写Python脚本来连接Oracle数据库和MySQL数据库,并执行数据导入操作。在ETL工具中创建一个转换任务,从Oracle数据库读取数据,并将数据写入MySQL数据库。a. 配置源连接:指定Oracle数据库的连接信息。

ThDebug的博客 4423

oracle 到mysql转换工具

一个可以从oralce转换为mysql语句的客户端,操作简单,按照向导只需要几步即可完成,各位小伙伴记得给个好评哦!

【DB】Oracle转MySQL

摘要:Oracle 转 MySQL 大小写规则、时间转换、字符串拼接、空值(NULL)处理、兼容与替代方案、字符串聚合函数、LENGTH函数、分页、正则表达式

寻道书生的博客 1047

CATIA二次开发CAA:(一)开发环境搭建

CATIA+CAA+RADE+VS2012

ysm1987的博客 1万+

oracle转mysql数据库

一、在oracle上创建函数: CREATE OR REPLACE procedure convert_date_to_timestamp is v_query_base_sql varchar2(100) := 'SELECT table_name, column_name, data_type FROM all_tab_cols WHERE table_name = '''; v_qu...

qq_36323075的博客 2万+

OS实验xv6 6.S081 开坑

OS实验xv6 6.S081 开坑 终于把xv6 2019 6.S081做完了,网络部分没有写,因为有计网实验了。怎么说呢,xv6的坑有点多,能做完多亏了:和我同学ljj交流,参考RedemptionC老哥的博客(他写的非常详细,遗憾的是,他好像没有写mmap),再者就是参考这位老哥的做法(没有源码,写得不是特别详细,不过有借鉴作用,mmap就是借鉴了他的思想)……废话不多说了,直接开始。 实验指导 首推RedemptionC的博客 这位老哥的个人博客 xv6 6.S081官网(后面的实验都要参考官网

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 4493

一键转换B站M4S缓存为MP4:无需FFMPEG命令的简易工具

本文介绍了一款专为B站用户设计的绿色工具,可将缓存的M4S视频和音频文件一键转换为通用MP4格式。该工具完全图形化操作,无需学习复杂的FFmpeg命令,解决了普通用户处理B站缓存视频的痛点。文章详细讲解了从下载、配置到转换的完整流程,并提供了常见问题排查与安全使用建议,帮助用户高效、安全地管理离线视频内容。

joy55的博客 480

DB-Engines 5月数据库排名:MySQL或将超越Oracle?

导读:DB-Engines最近发布了2021年5月份的数据库排名。该网站根据数据库管理系统的受欢迎程度对其进行排名,实时统计了371种数据库的排名指数。前20名的排行情况详见下图来源:华章...

华章IT官方博客 1371

从零到一:手把手教你用C#开发AGV调度系统(附避坑指南)

本文详细介绍了如何使用C#开发高效的AGV调度系统,涵盖从环境搭建到核心算法实现的完整流程。重点解析了动态路径规划、多机协同等关键技术,并提供了实用的避坑指南和性能优化建议,帮助开发者快速构建工业级车辆控制调度系统。

blockchain9miner的博客 741

oracle里有limit怎么用,[ORACLE]ORACLE 实现mysql中的limit 功能

[ORACLE]ORACLE 实现mysql中的limit 功能项目从mysql迁移到ORACLE中遇到移植问题,mysql中支持limit 而ORACLE say no .解决方法 利用ORACLE的伪列 rownum来控制。。Mysql : select * from table limit 10equlORACLE: select * from table where rownum <...

weixin_42537499的博客 4992

逆向工程实战:解密AppleAccount的X-MMe-Nas-Qualify签名生成机制

本文通过逆向工程实战,详细解析了AppleAccount服务中X-MMe-Nas-Qualify签名的生成机制。作者利用Frida进行动态追踪定位签名源头,结合IDA Pro进行静态分析,并借助LLDB动态调试还原核心算法。文章最终分享了如何独立于苹果官方库,通过Python代码复现签名算法,为自动化测试和深度交互苹果服务的开发者提供了关键技术路径。

weixin_29323049的博客 706

Unity Sprite Atlas C++底层原理全解析 —— “像素聚合工厂”的秘密

Unity Sprite Atlas C++底层实现简析 Sprite Atlas是Unity中用于优化2D渲染性能的核心机制,其C++底层实现如同一个高效的"像素聚合工厂"。该系统通过将多个小纹理合并为一个大纹理,显著减少Draw Call次数和GPU纹理切换开销。 在数据结构上,底层采用SpriteAtlasData存储图集元数据,PackedTexture管理合并后的大纹理,SpriteFrame记录每个子精灵的位置信息,并通过哈希表实现快速查找。编辑器阶段使用最大矩形等算法优化空

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 204

SQLServer,MySQL,Oracle,PostgreSQL数据库优缺点

Oracle,Mysql,SQLServer三分天下,SQLServer入门门槛确实低,Oracle灵活度大学习成本高,Mysql也有社区版和收费版,Mysql收费版有更高的性能更好的备份工具

港城大白鲨 4984

6、哈代空间、算子函数及相关概念解析

本文深入探讨了数学中哈代空间与算子函数的核心概念,包括强函数的因式分解、半单零点的定义与性质、Blaschke-Potapov乘积的存在性、Nagy-Foias模型算子的结构与谱分析、可数集合的相关性质(如Carlesonian集合、稀有集合等)、简单分式族的可分性与基性质,以及指数型整函数的增长特性。文章还分析了这些数学对象之间的内在联系,并通过图表与表格形式直观呈现了集合性质与函数空间结构的关系。这些理论不仅在数学分析和泛函分析中具有重要意义,也在信号处理、量子力学等应用领域具有广泛价值。

yhn4567890的博客 169

mysql db link_Oracle建立DB-LINK

Oracle建立DB-LINK 测试条件 两台服务器 远程:IP:192.168.0.18,SID: usertest,用户名:usertest,密码:123456 本地:IP: 192.168.8.Oracle建立DB-LINK测试条件两台服务器远程:IP:192.168.0.18,SID: usertest,用户名:usertest,密码:123456本地:IP: 192.168.8.90,S...

weixin_27013291的博客 375

大厂校招:星宸科技嵌入式面试及参考答案(5万字长文)

当一个新的硬件设备被插入系统时,内核会发送一个设备事件通知 udev,udev 会根据设备的属性和规则,为该设备创建一个合适的设备文件。通过去除不必要的驱动程序、禁用不需要的功能、选择合适的内核配置选项、优化内核编译选项和定制内核模块等方法,可以减小内核的大小和复杂性,提高系统的性能和稳定性。上半部通常是在中断关闭的情况下执行的,以确保中断处理的原子性。处理碎片化内存是内存管理中的一个重要问题,可以采用内存压缩、内存池管理、伙伴系统、首次适应算法和最佳适应算法等方法来减少内存碎片的产生,提高内存的利用率。

大模型大数据攻城狮的专栏 2927

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

为什么选择Chat2DB:3个颠覆性功能解析数据库管理新范式

Chat2DB是一款AI驱动的智能数据库管理工具,它通过自然语言交互彻底改变了传统数据库操作方式,让开发者和数据团队能够用对话的方式管理MySQL、PostgreSQL、Oracle等主流数据库。这个开源项目不仅提供了直观的可视化界面,更将AI能力深度集成到数据库工作流中,实现了从SQL编写到数据管理的全链路智能化。 ## 传统数据库管理的多重挑战 在传统数据库管理工作中,开发者面临着几个核心

gitblog_00351的博客 972

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Hutool DB实战:5分钟搞定MySQL与Oracle双数据库连接(附完整代码)

本文详细介绍了如何使用Hutool DB模块在Java项目中快速配置并同时连接MySQL与Oracle数据库。通过实战代码演示,文章展示了如何通过简洁的配置文件和JDBC驱动管理,在5分钟内完成双数据源搭建,并涵盖CRUD操作、事务处理及性能优化等核心实践,显著提升多数据库场景下的开发效率。

nept的博客 843

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Oracle通过database link连接到mysql

有1个需要从oracle连到mysql的需求,此采用的database link连过去。以下所有的操作都是oracle机器上完成。 mysql机器保证能连通即可。 机器信息: 两机OS: CentOS release 6.6 (Final) Kernel \r on an \m oracle:11201 64位 mysql: mysql> select versio

DATA 1640

【Sqoop】Oracle/MySQL中Schame、Database的区别

在关系型数据库中,分三级:database.schema.table。 一个数据库下面可以包含多个schema,可以给不同的用户创建不同的schema,并且他们都是在同一数据库实例下面。 一个schema下可以包含多个数据库的对象:表、存储过程、触发器等。 不是所有数据库都实现了schema这一层,Mysql则直接把schema和database等效了, ...

Together 1751

Windows Oracle database link mysql

Windows Oracle database link mysql 背景: 由于业务需要,我也从来没有搭建过,odbc和透明网关也是公司之前就搭建好了的。 但是(!!!)透明网关注意检查插件,配置Mysql 就要 gateway for odbc ,连接SQLServer 就用 gateway for msql 反正我是被坑惨了,最后花了3天时间才弄好。 本地环境: 1、windows服务器 2、oracle 11数据库 3、gateway 11:透明网关 4、odbc 第一步:找到你的ORACLE_H

YP_luck的博客 2009

Oracle转Mysql

数据类型 编号 ORACLE MYSQL 注释 1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型; MYSQL有很多类int型,tinyint mediumint bigint等,不同的int宽度不一样。 在MYSQL5.7版本中,已经支持高精度的值赋给低精度变量的情况,但是在MYSQL5.6以及以下版本中,出现高精度的结果赋给低精度变量的情况,需要在赋值是进行ROUND处理。 2 Va.

Zero_HWA的博客 1606
上一篇: 工具篇(Maven)---Maven详解
下一篇: 框架篇(Netty) ---Netty入门讲解
Coder_Light
博客等级 码龄9年 30粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值