SQL 加上将 Char 转换为 Byte 以用于 Oracle 复制命令
SQL Plus converting Char to Byte for Oracle Copy Command
在 Oracle SQL Plus 中,在创建 table/inserting 记录时使用复制命令总是将 Table CHAR /VARCHAR2 列转换为 BYTE 格式并导致长度不匹配问题,所以我无法重新复制到我原来的表格。
在 SESSION 和 sqlnet.ora 中尝试了以下设置,但没有帮助
改变会话集NLS_LENGTH_SEMANTICS = CHAR;
已连接。
SQL> DESC DDD1;
Name Null? Type
----------------------------------------- -------- ----------------------------
ROW_ID NOT NULL VARCHAR2(15 CHAR)
PRIV_FLG NOT NULL CHAR(1 CHAR)
SQL> COPY TO USER/PASS@DB CREATE DDD12 USING SELECT * FROM DDD1;
Array fetch/bind size is 15. (arraysize is 15)
完成后会提交。 (复制提交为 0)
最大长尺寸为 80。(长为 80)
Table DDD12 已创建。
从 DEFAULT HOST 连接中选择了 5036 行。
5036 行插入 DDD12。
5036 行提交到 USER/PASS@DB.
的 DDD12
SQL> DESC DDD12;
Name Null? Type
----------------------------------------- -------- ----------------------------
ROW_ID NOT NULL VARCHAR2(60)
PRIV_FLG NOT NULL CHAR(4)
实际应该是 DDD1 的副本 Table。
the COPY command 的文档说:
The COPY command is not being enhanced to handle datatypes or features introduced with, or after Oracle8i. The COPY command is likely to be made obsolete in a future release.
字符长度语义为 introduced in Oracle 9i:
Oracle9i introduces character semantics. It is useful for defining the storage ...
因此,虽然它可能有点令人失望,但 COPY 不支持 'new' 功能也许并不奇怪;而且这不是他们现在可能添加的东西。您正在为远程数据库创建一个新的 connection/session,并且该新会话必须在建立连接后重新发出 alter session
。由于这没有发生,它默认为目标的数据库初始化参数值,即 BYTE。
SQL 开发人员 确实 显然重新发布了 alter session
,这也许更令人惊讶。也许对您更有用,如果您想为此使用命令行工具而不是 GUI,SQLcl 也可以。如果您想使用该命令并保留源语义,则必须使用其中之一而不是 SQL*Plus。
另一种选择可能是从您当前的目标数据库开始,在那里设置会话参数,然后从 当前的源数据库复制。或者,如果你不能这样做,你可能有一个数据库触发器来发出 alter session
,但现在可能有点复杂了......
还值得注意的是 MoS 文档 ID 2914.1 "Common SQL*Plus Questions and Answers" 上面写着:
Q: What is the purpose of the COPY command ?
A: Copy command in SQL*Plus is useful when you want to transfer data between Oracle and NON-Oracle databases. If you want to copy Oracle table to another Oracle table, use "create table .. as select .." or "create table, insert into .. select .." statements. Columns may lose precision if you copy from Oracle rdbms to Oracle rdbms.
虽然这并不能真正提供复制到另一个数据库的替代方法,但您可以使用数据库 link;或 export/import.
在 Oracle SQL Plus 中,在创建 table/inserting 记录时使用复制命令总是将 Table CHAR /VARCHAR2 列转换为 BYTE 格式并导致长度不匹配问题,所以我无法重新复制到我原来的表格。
在 SESSION 和 sqlnet.ora 中尝试了以下设置,但没有帮助
改变会话集NLS_LENGTH_SEMANTICS = CHAR;
已连接。
SQL> DESC DDD1;
Name Null? Type
----------------------------------------- -------- ----------------------------
ROW_ID NOT NULL VARCHAR2(15 CHAR)
PRIV_FLG NOT NULL CHAR(1 CHAR)
SQL> COPY TO USER/PASS@DB CREATE DDD12 USING SELECT * FROM DDD1;
Array fetch/bind size is 15. (arraysize is 15) 完成后会提交。 (复制提交为 0) 最大长尺寸为 80。(长为 80) Table DDD12 已创建。
从 DEFAULT HOST 连接中选择了 5036 行。 5036 行插入 DDD12。 5036 行提交到 USER/PASS@DB.
的 DDD12SQL> DESC DDD12;
Name Null? Type
----------------------------------------- -------- ----------------------------
ROW_ID NOT NULL VARCHAR2(60)
PRIV_FLG NOT NULL CHAR(4)
实际应该是 DDD1 的副本 Table。
the COPY command 的文档说:
The COPY command is not being enhanced to handle datatypes or features introduced with, or after Oracle8i. The COPY command is likely to be made obsolete in a future release.
字符长度语义为 introduced in Oracle 9i:
Oracle9i introduces character semantics. It is useful for defining the storage ...
因此,虽然它可能有点令人失望,但 COPY 不支持 'new' 功能也许并不奇怪;而且这不是他们现在可能添加的东西。您正在为远程数据库创建一个新的 connection/session,并且该新会话必须在建立连接后重新发出 alter session
。由于这没有发生,它默认为目标的数据库初始化参数值,即 BYTE。
SQL 开发人员 确实 显然重新发布了 alter session
,这也许更令人惊讶。也许对您更有用,如果您想为此使用命令行工具而不是 GUI,SQLcl 也可以。如果您想使用该命令并保留源语义,则必须使用其中之一而不是 SQL*Plus。
另一种选择可能是从您当前的目标数据库开始,在那里设置会话参数,然后从 当前的源数据库复制。或者,如果你不能这样做,你可能有一个数据库触发器来发出 alter session
,但现在可能有点复杂了......
还值得注意的是 MoS 文档 ID 2914.1 "Common SQL*Plus Questions and Answers" 上面写着:
Q: What is the purpose of the COPY command ?
A: Copy command in SQL*Plus is useful when you want to transfer data between Oracle and NON-Oracle databases. If you want to copy Oracle table to another Oracle table, use "create table .. as select .." or "create table, insert into .. select .." statements. Columns may lose precision if you copy from Oracle rdbms to Oracle rdbms.
虽然这并不能真正提供复制到另一个数据库的替代方法,但您可以使用数据库 link;或 export/import.