如何在Oracle中插入长字符串CLOB或BLOB

4

我该如何将非常长的文本 100000 <length(string) < 300000 插入到 Oracle 的 CLOB 或 BLOB 中?

DECLARE
    v_long_text CLOB;
BEGIN
    v_long_text := 'my long string text';

    INSERT INTO MYTABLE_NAME 
    VALUES      (v_long_text);
END;

该方法无法正常工作,返回错误信息PLS-00172: 字符串太长


列的数据类型是什么? - Sandesh Gupta
我两个都有,无论哪一个都可以。 - Meqenaneri Vacharq
这个回答解决了你的问题吗?Oracle 10:使用HEXTORAW填充blob数据 - Vadzim
3个回答

8

您的文字字面量隐式地成为了一个varchar类型,因此您无法将大于varchar最大文本长度(plsql中的最大varchar长度为32767)的值分配给v_long_text

您可以使用连接符:

DBMS_LOB.APPEND(v_long_text, 'very long string');
DBMS_LOB.APPEND(v_long_text, 'yet another long string');

当然,我假设MYTABLE_NAME列的类型是CLOB。
更新: 示例代码:
DECLARE
    v_long_text CLOB;
BEGIN
   DBMS_LOB.CREATETEMPORARY(v_long_text,true);
   DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
   DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
   DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
   DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
   DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
   DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
   DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));

    INSERT INTO my_table VALUES (v_long_text);
END;

我该怎么做?请编写简单的查询。 - Meqenaneri Vacharq
帮了我很多!这应该是最好的选择。 - Mavic More

0

其他方法也不错。但是,如果您在文件系统中存储了长字符串,您可以利用以下方法:

  • 使用 SQL* loader 加载:这很容易和直接,并且可以自动化从文件系统读取。
  • 使用 Unix 的 split 实用程序和 -b 选项将文件中的长文本分成较小的块(例如32000或4000),并在 shell 脚本中构造多个插入语句。

类似于:

split -b 4000 yourbigfile split_files_
ct=1
for chunk in $(cat split_files_??)
 do
   # first time
   echo "INSERT INTO table_name(col_name) VALUES ('${chunk}');"
   # 2nd and subsequent
  echo " update table_name set col_name = col_name || '$chunk';"
  ct=$((ct + 1))
done >yourinsert_script.sql
  • 创建一个PL/SQL过程,使用UTL_FILE从文件中读取文本并插入到表中。

你检查过解决方案了吗? 在类似的情况下,我遇到了ORA-01489错误:字符串连接的结果太长。 - Kunis
@kunis:我不确定你是怎么做的。据我记得,这对我来说是有效的。可能在你的代码中有地方连接了字面量,其总大小超过了4000个字符。 - Kaushik Nayak
@nayak UPDATE "<table>" SET BK_DATASET_SQL = 'SELECT SK_ACCNT_PUR_HIST_ID||''' || chr(38) || '3''|| ..... ' WHERE ...如果我要放入BK_DATASET_SQL的文本太长(超过4000个符号),我会收到ORA-01489错误:字符串连接的结果太长。 - Kunis

0
DECLARE
    definition_clob CLOB;

BEGIN
dbms_lob.createtemporary(definition_clob, true);
dbms_lob.append(definition_clob,'String 1.. ">
dbms_lob.append(definition_clob,'String 2.. ">
.
.
.
INSERT INTO TABLE
(CLOB_COLUMN)
VALUES
(definition_clob)

COMMIT
dbms_lob.freetemporary(definition_clob);

END;
/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接