内容纲要
概要描述
数据结构从Oracle 迁移到 Inceptor的过程中,经常遇到无法通过工具直接导入 Inceptor 的问题,需要批量对 Oracle 的 DDL 进行转换,转换成 Inceptor 能够识别的 DDL 语句,由于我们只需要 inceptor 外表,所以过程中重点关注字段类型映射、location 路径指定。
详细说明
实际的原理是通过动态拼接 DDL 语句,其中遇到数据类型和 Inceptor 不匹配的,进行数据类型转换即可。
1. 对用户添加Utl_file权限
--定义生成文本的路径
> create or replace directory "FILEPATH" as 'D:/oracle';
> grant read,write on directory FILEPATH to lkw;
> grant execute on utl_file to lkw;
2. 执行语句块
注意:如果发现生成的 DDL 中没有数据类型,可以参考 Oracle 和 Inceptor的对应关系自行添加 case when 判断
--原理其实就是动态拼接DDL语句,在user_tab_columns对数据类型进行转换,然后生成的文本输出到oracle服务器上
--如果想指定导出的表,可以在user_tables这个for循环上加where条件
--oracle与inceptor字段类型映射,参考inceptor手册中的"数据类型对应表"
declare
v_sql varchar2(4000);
OutputFile utl_file.file_type;
begin
OutputFile := utl_file.fopen('FILEPATH', 'target.sql', 'W');
for tb_name in (select table_name from user_tables) loop
select 'create external table ' || tb_name.table_name || '(' ||wmsys.wm_concat(COLUMN_NAME || ' ' || dtype) || ') location ''/oracle/' || tb_name.table_name || ''';'
into v_sql
from (select t.TABLE_NAME,
t.COLUMN_NAME,
case data_type
when 'NUMBER' then
' decimal(' || data_length || ',' || nvl(data_scale, 0) || ') '
when 'FLOAT' then
' decimal(' || data_length || ',' || nvl(data_scale, 0) || ') '
when 'VARCHAR2' then
' string '
when 'DATE' then
' string '
when 'INTEGER' then
' decimal(38,0)'
when 'CHAR' then
' string '
when 'BLOB' then
' binary '
when 'CLOB' then
' binary '
end dtype
from user_tab_columns t
where table_name = tb_name.table_name
order by COLUMN_ID asc);
utl_file.put_line(OutputFile, V_SQL);
end loop;
utl_file.fclose(OutputFile);
end;
/
3. 到oracle服务器获取 D:/oracle/target.sql
检查 D:/oracle/target.sql 的内容,如下图所示:

4. 通过beeline -f的形式执行该 sql 文本完成 DDL 迁移
如果您在使用中有任何疑问,可以随时通过 售后渠道 联系我们,感谢您的理解与支持!