You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Perl正则实现Oracle转PostgreSQL的TO_NUMBER替换及批量SQL转换工具

Oracle TO_NUMBER 转 PostgreSQL ::integer 的 Perl 正则及批量转换工具推荐

一、处理嵌套场景的 Perl 正则表达式

要支持任意层级嵌套的TO_NUMBER函数替换,需用Perl的递归正则匹配括号平衡结构,对应的替换写法如下:

s/TO_NUMBER\(\s*( (?:[^()]|(?R))+ )\s*\)/($1)::integer/gx;

正则说明:

  • TO_NUMBER\(:匹配TO_NUMBER(的起始标识
  • \s*:兼容括号前后的任意空白字符
  • (?:[^()]|(?R))+:核心递归匹配逻辑,要么匹配非括号字符,要么递归匹配整个正则结构,完美处理嵌套函数场景
  • /gx:g表示全局替换,x允许正则中加入空白提升可读性

转换示例:

  • 原Oracle语句:SELECT TO_NUMBER(id), TO_NUMBER(TO_CHAR(age) || '100') FROM users;
  • 转换后PostgreSQL语句:SELECT (id)::integer, (TO_CHAR(age) || '100')::integer FROM users;

二、批量转换SQL的工具推荐

以下均为支持本地批量处理、无需在线交互的工具:

  • pgLoader:原本主打数据迁移,内置Oracle到PostgreSQL的SQL语法转换模块,可批量导入整个目录的Oracle SQL脚本,自动处理TO_NUMBER这类函数转换,同时兼容数据类型、语法差异等问题。
  • 本地部署的Oracle-PostgreSQL转换工具:如DBConvert Studio本地版,支持批量加载多个SQL文件,可可视化配置转换规则,能处理复杂嵌套函数、存储过程等场景的批量转换。
  • 自定义Perl脚本:结合上述正则,写一个简单脚本遍历指定目录下的所有.sql文件批量执行替换,适合轻量需求或需要自定义规则的场景,示例框架如下:
use strict;
use warnings;

use File::Find;

my $dir = '/path/to/your/sql/files';
find(\&process_file, $dir);

sub process_file {
    return unless /\.sql$/i;
    my $file = $_;
    open my $fh, '<', $file or die "Can't open $file: $!";
    my $content = do { local $/; <$fh> };
    close $fh;

    $content =~ s/TO_NUMBER\(\s*( (?:[^()]|(?R))+ )\s*\)/($1)::integer/gx;

    open $fh, '>', $file or die "Can't write to $file: $!";
    print $fh $content;
    close $fh;
    print "Processed $file\n";
}

内容的提问来源于stack exchange,提问作者SteveTR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:51:02