默认情况下,expdp 生成内部 DDL 来创建观察每列当前 NLS_LENGTH_SEMANTICS 的表。
如果将列作为 BYTE(默认和最常用)NLS_LENGTH_SEMANTICS,则内部 DDL 将如下所示:
CREATE TABLE BDATA.Artikel(
Key VARCHAR2(3 BYTE) NOT NULL,
Name VARCHAR2(60 BYTE) NOT NULL,
Abkuerzung VARCHAR2(5 BYTE) NOT NULL
);
但我想要一个选项来强制 expdp 不从 DBA_TAB_COLUMNS 获取/继承 CHAR_USED 值,从而导致以下 DDL:
CREATE TABLE BDATA.Artikel(
Key VARCHAR2(3) NOT NULL,
Name VARCHAR2(60) NOT NULL,
Abkuerzung VARCHAR2(5) NOT NULL
);
原因是目标数据库有一个 AL32UTF8 字符集和 NLS_LENGTH_SEMANTICS 设置为 CHAR。所以我希望将表从 BYTE 转换为 CHAR(根据 NLS_LENGTH_SEMANTICS 参数值)。
我做了一个快速而肮脏的解决方案,今天对我有用(Oracle 12.1),没有理由等待接下来的 11 年。
这个功能是 11 年前提出的,现在还没有实现:
错误 5034478:ENH:将参数添加到 IMPDP 以覆盖 NLS_LENGTH_SEMANTICS