oracle:将大字符串添加到 clob 列
oracle: add large string to clob colum
我想向 Oracle 数据库中的 CLOB 列添加一个大字符串(超过 76k 个字符)。
我需要 运行 来自 liquibase 框架的脚本。
如何实现?
简单插入
INSERT INTO table_clob (clob_column) VALUES (to_Clob('string above 72000 chars...'));
有和没有 to_clob()
方法返回异常,如:
ORA-01704: 字符串文字太长
无法按照此处所述的过程从文件加载数据:https://oracle-base.com/articles/8i/import-clob
因为我没有任何目录的权限
搜索google但没有找到满足我要求的任何解决方案。
有什么建议吗?
更新:
经过几个小时的搜索终于在这里找到了解决方法:
这还不够,因为我需要手动将文本剪切为 3 个块(大约 30k 个字符),但它可以工作。
现在只需要弄清楚我们如何动态地做到这一点,以防字符串具有不同长度的字符(例如超过 10k 个字符)。
用单引号括起来的硬编码字符串称为字符串文字。一个例子是 'Hello world'
。另一个例子是您试图在 table 中插入的非常长的字符串。相比之下,'abc' || 'def'
是一个字符串表达式,但它不是字符串 literal。同样,to_char(sysdate, 'yyyy-mm-dd')
是字符串表达式,而不是 文字 。 “文字”表示不变的硬编码文本。
您遇到的问题与 insert
、或 to_clob()
、或您的 table 中列的数据类型等无关。它只与字符串文字本身。
在 Oracle 中,字符串文字的长度最多为 4000 字节(如果数据库设置为扩展 MAX_STRING_SIZE
,则为 32767 字节)。 PERIOD!没有办法解决。
所以,问题是,你怎么能得到一个字符串,只要你有一个 table 和 CLOB
列。答案首先取决于您接收字符串的方式。最好的选择是如果它已经分块了——作为一个字符串集合,带有一个标签(一个 id)来跟踪哪个片段属于哪个 CLOB 和一个序号(显示它是第一个块,第二个等)然后你可以在第一个块上使用 TO_CLOB()
加上连接运算符来重新 assemble 它们。
如果您的过程是在键盘上键入 72000 个字符,则您必须一次键入其中的 4000 个,用单引号括起来,并使用连接运算符(基本上是我上面描述的手动操作)。您还必须在第一个片段上使用 TO_CLOB()
(否则连接将失败)。
另一个选项是字符串作为一个值,来自一些支持长字符串的应用程序(与 Oracle 的 CLOB 兼容的东西)并且可以将这些值交给 Oracle 数据库而不需要写出硬-完整编码的字符串。
所以,球在你的球场上。第一个问题是,长字符串首先来自哪里?
我想向 Oracle 数据库中的 CLOB 列添加一个大字符串(超过 76k 个字符)。 我需要 运行 来自 liquibase 框架的脚本。 如何实现?
简单插入
INSERT INTO table_clob (clob_column) VALUES (to_Clob('string above 72000 chars...'));
有和没有 to_clob()
方法返回异常,如:
ORA-01704: 字符串文字太长
无法按照此处所述的过程从文件加载数据:https://oracle-base.com/articles/8i/import-clob 因为我没有任何目录的权限
搜索google但没有找到满足我要求的任何解决方案。 有什么建议吗?
更新:
经过几个小时的搜索终于在这里找到了解决方法:
这还不够,因为我需要手动将文本剪切为 3 个块(大约 30k 个字符),但它可以工作。 现在只需要弄清楚我们如何动态地做到这一点,以防字符串具有不同长度的字符(例如超过 10k 个字符)。
用单引号括起来的硬编码字符串称为字符串文字。一个例子是 'Hello world'
。另一个例子是您试图在 table 中插入的非常长的字符串。相比之下,'abc' || 'def'
是一个字符串表达式,但它不是字符串 literal。同样,to_char(sysdate, 'yyyy-mm-dd')
是字符串表达式,而不是 文字 。 “文字”表示不变的硬编码文本。
您遇到的问题与 insert
、或 to_clob()
、或您的 table 中列的数据类型等无关。它只与字符串文字本身。
在 Oracle 中,字符串文字的长度最多为 4000 字节(如果数据库设置为扩展 MAX_STRING_SIZE
,则为 32767 字节)。 PERIOD!没有办法解决。
所以,问题是,你怎么能得到一个字符串,只要你有一个 table 和 CLOB
列。答案首先取决于您接收字符串的方式。最好的选择是如果它已经分块了——作为一个字符串集合,带有一个标签(一个 id)来跟踪哪个片段属于哪个 CLOB 和一个序号(显示它是第一个块,第二个等)然后你可以在第一个块上使用 TO_CLOB()
加上连接运算符来重新 assemble 它们。
如果您的过程是在键盘上键入 72000 个字符,则您必须一次键入其中的 4000 个,用单引号括起来,并使用连接运算符(基本上是我上面描述的手动操作)。您还必须在第一个片段上使用 TO_CLOB()
(否则连接将失败)。
另一个选项是字符串作为一个值,来自一些支持长字符串的应用程序(与 Oracle 的 CLOB 兼容的东西)并且可以将这些值交给 Oracle 数据库而不需要写出硬-完整编码的字符串。
所以,球在你的球场上。第一个问题是,长字符串首先来自哪里?