侧边栏壁纸
  • 累计撰写 16 篇文章
  • 累计创建 52 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
DB

达梦数据库适配(mysql适配达梦数据库)注意内容

Stone
2022-10-12 / 0 评论 / 0 点赞 / 549 阅读 / 814 字
转载自:达梦数据库适配(mysql适配达梦数据库)注意内容

达梦数据库一般是国产化适配选择的一种数据库,最近做这方面是的适配,感觉是基于oracle所开发的一种数据库,对 mysql 兼容性并不强,现在列一下需要注意的内容。

1.ORDER BY项不在DISTINCT查询项中
这种问题比较常见,DISTINCT 的查询项需要在 ORDER BY 项,这种得根据业务实际修改。
2.GRUOP BY 字段需要跟select字段对应上
跟 ORDER BY 类似,GRUOP BY 中的字段要出现在 select 字段中。
3.str_to_date()函数不适用
改为 to_date() 函数,参数也需要修改。
4.group_concat()函数不适用
改为 wm_concat() 或者 LISTAGG(name,’,’) GROUP_CONCAT 后面的 order by 也不适用
5.convert(value,type)函数
达梦中的 convert 和mysql 的使用方式是相反的。
换为 convert(type,value)
6.if()函数
改为 case when
7.FIND_IN_SET()函数
自建函数

CREATE 
  OR REPLACE FUNCTION FIND_IN_SET 
  (
    piv_str1 varchar2,
    piv_str2 varchar2,
    p_sep varchar2 := ','
  ) 
  RETURN NUMBER 
    IS 
  l_idx     number:=0;                 -- 用于计算piv_str2中分隔符的位置
  str       varchar2(500);             -- 根据分隔符截取的子字符串
  piv_str   varchar2(500) := piv_str2; -- 将piv_str2赋值给piv_str
  res       number        :=0;         -- 返回结果
  loopIndex number        :=0;
BEGIN
  -- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1
  IF instr( piv_str, p_sep, 1 ) = 0 THEN
    IF piv_str = piv_str1 THEN
      res := 1;
    END IF;
  ELSE
    -- 循环按分隔符截取piv_str
    LOOP
      l_idx     := instr( piv_str, p_sep );
      loopIndex := loopIndex + 1;
      -- 当piv_str中还有分隔符时
      IF l_idx > 0 THEN
        -- 截取第一个分隔符前的字段str
        str := substr( piv_str, 1, l_idx - 1 );
        -- 判断 str 和piv_str1 是否相等,相等 res=1 并结束循环判断
        IF str = piv_str1 THEN
          res := loopIndex;
          EXIT;
        END IF;
    piv_str := substr(piv_str, l_idx + length( p_sep ));
      ELSE
        -- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1
        IF piv_str = piv_str1 THEN
          res := loopIndex;
        END IF;
        -- 无论最后是否相等,都跳出循环
        EXIT;
      END IF;
    END LOOP;
    -- 结束循环
  END IF;
  -- 返回res
  RETURN res;
END FIND_IN_SET;

COMMIT;

8.试图在blob或者clob列上排序或比较
需要将大数据类型的字段转换为字符类型
使用 to_char() 函数转换后可适配成功
9.双引号的常量 需要改为 单引号的常量
比如 select “aaa” from [table]
改成 select ‘aaa’ from [table]
10.表字段有关键字的,引用需要加上双引号
比如 select function from [table]
或者 select function from [table]
改为 select “function” from [table]
11.force index 强制索引
需要修改语法,如果真需要走强制索引,需要使用
SELECT /*+INDEX(T1, IDX_T1_ID) */ * FROM T1 WHERE ID > 2011 AND NAME < ‘XXX’;
12.INTERVAL 后面的参数 需要加单引号
13.CAST(xxx as signed INTEGER) 不支持
14.除0错误 先判断字段是否为0
15.CONCAT(“%”,xxx,“%”) 改为单引号
16.TO_DATE(NOW(),‘yyyy-MM-dd’) 报错
改为 DATE_FORMAT(SYSDATE, ‘%Y-%m-%d’)

0

评论区