Mysql存储过程移植Dm(达梦数据库)/Oracle对照表

这篇博客探讨了MySQL和Oracle数据库中的一些关键操作,如统计改变行数的row_count()和sql%rowcount,以及SHA1加密的不同实现。还提到了获取自增ID的方法和变量赋值的语法差异。此外,解释了动态SQL的两种执行方式:PREPARE/EXECUTE和EXECUTE IMMEDIATE,并展示了字符串切割和关键字冲突解决的技巧。

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

Mysql

Oracle(DM)

说明

row_count()

sql%rowcount

统计改变行数(复制可用)

SHA1(参数)

lower(dbms_crypto.hash(utl_raw.cast_to_raw(参数), dbms_crypto.HASH_SH1))

SHA1加密

last_insert_id

ident_current('表名必须正确区分大小写')

获得自增id已经使用的最大序号

赋值的时候:set msg_count =0

msg_count:=0

赋值语句的话Oracle没有set 直接是参数名:=结果

declare在begin之后并且多个变量多个declare比如:

declare

_num1 bigint;

declare

_num2 bigint;

declare在begin之前 多个变量只能写在一个declare底下:

declare

_num1 bigint;

_num2 bigint;

Declare的使用是有些许区别的

PREPARE stmt from '你的sql语句';  

EXECUTE stmt (如果sql有参数的话, USING xxx,xxx); // 这里USING的只能是会话变量

DEALLOCATE PREPARE stmt;

execute immediate v_sql using in '1',in '2',out c; 

说明:v_sql 执行的sqsl 1,2,参数

动态sql的差别

substring_index( _user_id, '@', 1 )

SUBSTR (_user_id,0, instr(_user_id,'@',1,1)-1)

切割字符串

`value`用`引起来

VALUE双引号内冲突字符必须大写

解决关键字冲突

bigint unsigned

Number(21, 0)

 SUBSTR(jid, LOCATE('@', _jid) + 1))

SUBSTR(jid,LOCATE( '@', jid )+1)

<think>我们正在讨论达梦数据库的兼容Oracle模式。根据引用[1],达梦数据库有一个兼容性参数,可以设置为兼容Oracle(值为2)。引用[3]也提到了兼容ORACLE相关参数的介绍。用户的问题是如何在达梦数据库中使用兼容Oracle模式。 步骤: 1. 确认当前兼容模式:可以通过查询系统视图或参数来确认当前兼容模式。 2. 修改兼容模式:通过修改参数文件(dm.ini)中的COMPATIBLE_MODE参数,将其设置为2(兼容Oracle)。 3. 重启数据库实例:修改参数后需要重启数据库实例使配置生效。 4. 验证兼容模式:重启后验证是否已切换到兼容Oracle模式。 此外,引用[2]提到达梦数据库Oracle在日志文件等方面的差异,但用户主要关心兼容模式的使用。 具体操作: 1. 查看当前兼容模式: ```sql SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='COMPATIBLE_MODE'; ``` 如果返回值为2,则表示当前是兼容Oracle模式。 2. 修改兼容模式(如果当前不是2): - 使用SQL命令修改(需要重启): ```sql SP_SET_PARA_VALUE(1, 'COMPATIBLE_MODE', 2); ``` 或者直接编辑dm.ini文件,将COMPATIBLE_MODE的值改为2。 3. 重启数据库实例: ```bash # 以达梦安装用户执行 DmServiceDMDB restart ``` 4. 验证: - 重新登录数据库,执行步骤1的查询,确认COMPATIBLE_MODE值为2。 - 测试Oracle语法,例如:使用Oracle的DUAL表、ROWNUM等特性。 注意: - 兼容模式下,达梦数据库会尽量模拟Oracle的行为,包括数据类型、函数、系统视图等。 - 但并非所有Oracle特性都完全兼容,一些高级特性可能仍有差异(如引用[2]提到的日志文件位置和命名差异)。 示例测试: ```sql -- 在Oracle中,我们可以这样查询 SELECT SYSDATE FROM DUAL; -- 在达梦兼容Oracle模式下,同样可以执行 ``` 相关问题: 1. 达梦数据库兼容Oracle模式下支持哪些Oracle特有的函数? 2. 如何解决达梦数据库兼容Oracle模式下不支持的Oracle特性? 3. 达梦数据库的兼容模式切换后,对现有应用有什么影响? 4. 除了兼容Oracle达梦数据库还支持哪些兼容模式(如MySQL、SQL Server)? 5. 在兼容Oracle模式下,达梦数据库存储过程Oracle存储过程语法是否一致? 注意:引用[1][3]都提到了兼容模式的设置,引用[2]则提醒我们尽管有兼容模式,但仍有差异存在。</think>### 达梦数据库兼容Oracle模式使用指南 达梦数据库通过**兼容模式参数**实现对Oracle语法的支持,以下是详细使用方法: --- #### 一、开启Oracle兼容模式 1. **修改核心参数** ```sql -- 查看当前兼容模式 SELECT para_name, para_value FROM v$dm_ini WHERE para_name = 'COMPATIBLE_MODE'; -- 设置为Oracle兼容模式(值为2) SP_SET_PARA_VALUE(1, 'COMPATIBLE_MODE', 2); ``` *参数说明:* - `0`: 不兼容 - `1`: SQL92标准 - `2`: Oracle兼容模式[^1][^3] - `3`: MS SQL Server兼容 - `4`: MySQL兼容 2. **重启数据库实例** ```bash # 停止服务 DmServiceDMSERVER stop # 启动服务 DmServiceDMSERVER start ``` --- #### 二、兼容特性验证 1. **Oracle语法支持** ```sql -- Oracle风格的DUAL表查询 SELECT SYSDATE FROM DUAL; -- ROWNUM分页查询 SELECT * FROM ( SELECT t.*, ROWNUM rn FROM emp t WHERE ROWNUM <= 20 ) WHERE rn > 10; ``` 2. **系统函数兼容** ```sql -- Oracle常用函数 SELECT NVL(salary, 0), TO_CHAR(hiredate, 'YYYY-MM-DD') FROM employees; ``` 3. **PL/SQL兼容** ```plsql -- Oracle风格的存储过程 CREATE OR REPLACE PROCEDURE raise_salary( p_emp_id IN NUMBER, p_percent IN NUMBER ) AS BEGIN UPDATE emp SET sal = sal * (1 + p_percent/100) WHERE empno = p_emp_id; COMMIT; END; / ``` --- #### 三、兼容模式差异管理 | 特性 | 兼容表现 | 注意事项 | |---------------------|----------------------------------|----------------------------| | **数据字典视图** | 提供V$SESSION等Oracle风格视图 | 实际表结构有差异[^2] | | **日志文件** | 使用达梦特有路径/命名规则[^2] | 需调整监控脚本 | | **数据类型** | 支持VARCHAR2/NUMBER等Oracle类型 | CLOB/BLOB实现方式不同 | | **事务控制** | 支持COMMIT/ROLLBACK相同语法 | 隔离级别默认配置有差异 | | **对象命名** | 支持30字符长度限制 | 需关闭标识符大小写敏感参数 | --- #### 四、最佳实践建议 1. **迁移前检查** ```sql -- 使用达梦迁移工具进行兼容性评估 ./dts CHECK_ORACLE_COMPATIBILITY scott/tiger@orcl ``` 2. **混合模式开发** ```sql -- 在SQL中切换兼容模式(会话级) SET COMPATIBLE_MODE = 2; -- 当前会话启用Oracle语法 ``` 3. **参数调优** ```ini # dm.ini关键参数优化 CASE_SENSITIVE = 0 -- 关闭标识符大小写敏感 LENGTH_IN_CHAR = 1 -- 按字符计算长度(Oracle风格) ``` --- #### 五、常见问题解决 1. **函数不兼容** ```sql -- 创建Oracle风格的函数映射 CREATE OR REPLACE FUNCTION DM_TO_CHAR(n NUMBER) RETURN VARCHAR2 AS BEGIN RETURN CAST(n AS VARCHAR(50)); END; ``` 2. **性能差异处理** ```sql -- 使用达梦原生提示替代Oracle提示 SELECT /*+ INDEX(emp idx_emp_dept) */ * FROM emp WHERE deptno = 10; ``` > 重要提示:达梦Oracle兼容度约85%[^3],复杂存储过程需验证测试 --- ### 相关问题 1. 如何将Oracle的DBLINK功能迁移到达梦数据库? 2. 达梦的`ROWNUM`分页与Oracle的实现机制有何本质区别? 3. 在兼容模式下,Oracle的`AUTONOMOUS_TRANSACTION`如何实现? 4. 达梦的`V$SESSION`视图与Oracle的字段对应关系是什么?[^2] 5. 如何解决达梦不支持的Oracle高级特性(如`FLASHBACK TABLE`)? > 建议操作流程: > 1. 使用`dts`迁移工具评估兼容性 > 2. 设置`COMPATIBLE_MODE=2`并重启 > 3. 重点验证PL/SQL和复杂查询 > 4. 对不兼容项使用达梦等效方案替代[^3]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你相信光吗?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值