【问题标题】:Running into string constant size limits in insert statements with Oracle在使用 Oracle 的插入语句中遇到字符串常量大小限制
【发布时间】:2012-01-14 04:39:23
【问题描述】:

我正在尝试将一行从我们的生产数据库复制到我自己的小型个人 Oracle Express 数据库以重现错误,因为我无法真正进入生产代码。不幸的是,这一行涉及将某种数据结构序列化为blob 列类型的列,在规范化之神面前大笑。这是INSERT

INSERT INTO TPM_VIEWS VALUES(
5,
'Test Repro View',
665,
1,
'0001000000ffffffff01000000000000000c020000003a44414c2c205... //About 7600 characters
);

我尝试在 Aqua Data Studio 10 中运行它,我得到:

ORA-01704: string literal too long

接下来我尝试将其粘贴到 SQL*Plus 中,结果如下:

SP2-0027: Input is too long (> 2499 characters) - line ignored

最后,我尝试将整个内容粘贴到 foo.sql 并运行 @foo.sql,这给了我:

SQL> @c:\foo.sql
Input truncated to 7499 characters
SP2-0027: Input is too long (> 2499 characters) - line ignored
ERROR:
ORA-01756: quoted string not properly terminated

Oracle 专家的超级秘密方法是什么?不,我无权访问 Oracle 服务器本身,因此我无法运行任何命令行备份或导出实用程序。谢谢!

更新:

我还尝试通过随机散布一些 ' || ' 来拆分字符串,这给了我错误:

 ORA-01489: result of string concatenation is too long

【问题讨论】:

  • 可以登录生产数据库吗?还是你说你连这个都做不到?
  • @JustinCave - 是的,我可以在生产环境中运行任何我想要的 SQL 语句。

标签: sql oracle oracle11g


【解决方案1】:

由于您可以访问生产数据库,最简单的解决方案可能是创建一个从本地 XE 数据库到生产数据库的数据库链接。

CREATE DATABASE LINK link_to_prod
  CONNECT TO <<your user name in prod>> 
  IDENTIFIED BY <<your password in prod>>
  USING <<TNS alias for prod database>>

然后,您可以将数据从 prod 复制到本地数据库

INSERT INTO tpm_views
  SELECT <<list of columns including BLOB>>
    FROM tpm_views@link_to_prod
   WHERE <<some key>> = 5

【讨论】:

  • 太棒了!这就像一个魅力。这些链接是持久的,还是在我关闭会话时自动删除?下次一定要记住这个小技巧..
  • @MikeChristensen - 数据库链接本身是一个数据库对象,在您删除它之前将一直存在。当您关闭 XE 数据库中的会话时,与 prod 数据库的实际连接将关闭。如果您想在不关闭 XE 会话的情况下关闭与 prod 数据库的连接,您可以使用“ALTER SESSION CLOSE DATABASE LINK link_to_prod”来关闭它。
  • 有道理!顺便说一句,那个 7k 序列化的字符串原来在其中编码了对其他数据库主键的引用,我们在最近的升级中更改了这些主键的格式。现在我们必须修复这些 BLOB 中的 117 个,哈哈!糟糕的数据库设计怎么样..
  • @MikeChristensen - 数据库已正确规范化,是吗?可能出了什么问题?
猜你喜欢
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多