SQL Plus 将字符转换为字节以用于 Oracle 复制命令

Posted

技术标签:

【中文标题】SQL Plus 将字符转换为字节以用于 Oracle 复制命令【英文标题】:SQL Plus converting Char to Byte for Oracle Copy Command 【发布时间】:2019-07-29 14:32:59 【问题描述】:

在 Oracle SQL Plus 中,在创建表/插入记录时使用复制命令总是将表 CHAR /VARCHAR2 列转换为 BYTE 格式并导致长度不匹配问题,因此我无法重新复制到我的原始表。

在 SESSION 和 sqlnet.ora 中尝试了以下设置,但没有帮助

ALTER SESSION SET 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;

数组获取/绑定大小为 15。(数组大小为 15) 完成后将提交。 (复制提交为 0) 最大长尺寸为 80。(长为 80) 表 DDD12 已创建。

从 DEFAULT HOST 连接中选择了 5036 行。 5036 行插入 DDD12。 在 USER/PASS@DB 处将 5036 行提交到 DDD12。

SQL> DESC DDD12;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ROW_ID                                    NOT NULL VARCHAR2(60)
 PRIV_FLG                                  NOT NULL CHAR(4)

实际应该是 DDD1 表的副本。

【问题讨论】:

但同样的命令在 SQL Developer 中工作。 【参考方案1】:

the COPY command 的文档说:

COPY 命令没有得到增强以处理随 Oracle8i 或之后引入的数据类型或特性。 COPY 命令可能会在未来的版本中过时。

字符长度语义为introduced in Oracle 9i:

Oracle9i 引入了字符语义。它对于定义存储很有用...

因此,虽然这可能有点令人失望,但 COPY 不尊重“新”功能也许并不奇怪;这不是他们现在可能添加的东西。您正在创建到远程数据库的新连接/会话,并且该新会话必须在建立连接后重新发出 alter session。由于没有发生这种情况,它默认为目标的数据库初始化参数值,即 BYTE。

SQL Developer 确实显然重新发布了alter session,这可能有点令人惊讶。也许对您更有用,如果您想为此使用命令行工具而不是 GUI,SQLcl 也是如此。如果您想使用该命令并保留源语义,则必须使用其中之一而不是 SQL*Plus。

另一个选项可能是从您当前的目标数据库开始,在那里设置会话参数,然后复制 from 当前的源数据库。或者,如果你不能这样做,你可能会有一个 DB 触发器发出 alter session,但现在这可能有点复杂......

同样值得注意的是 MoS 文档 ID 2914.1 “Common SQL*Plus Questions and Answers”,其中写道:

问:COPY 命令的目的是什么?

答:当您想在 Oracle 和 NON-Oracle 数据库之间传输数据时,SQL*Plus 中的复制命令很有用。如果要将 Oracle 表复制到另一个 Oracle 表,请使用“create table .. as select ..”或“create table, insert into .. select ..”语句。如果从 Oracle rdbms 复制到 Oracle rdbms,列可能会丢失精度。

虽然这并不能真正提供复制到另一个数据库的替代方法,但您可以使用数据库链接;或导出/导入。

【讨论】:

嗨,Alex,我的目的实际上是在同一个数据库中为长列进行备份。但是 long 不能以其他方式复制整个表格行。我选择使用复制命令并以语义问题告终。我也尝试从 Target 会话中使用,同样的问题。 对;长列是一种痛苦。或许可以通过 PL/SQL 块来处理。 谢谢亚历克斯。请让我知道是否有其他方法可用,因为我将在多个表中处理多个长列。这需要很多plsql。

以上是关于SQL Plus 将字符转换为字节以用于 Oracle 复制命令的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用 javascript 将图像转换为字节数组以将图像存储在 sql server 上?

将字节数组转换为字符串 spark

如何将 PL/SQL .sql 文件转换为 SQL*PLUS,以便它可以与 Windows 任务计划程序一起运行

带有实体框架和 SQL Server 数据库的 ASP.NET MVC - 图像未显示在视图中......错误显示“无法将“字节”转换为“字符串”

如何将数字中的字节转换为字符串? (数字的字符表示)

如何将字节数组的字符串转换为字节数组