Oracle-在CLOB中存储大字符串

时间:2018-10-11 10:06:11

标签: plsql oracle11g

我需要使用变量将过程主体保存到Clob列中。字符串的长度超过4000个字符,因此我无法使用VarChar2,但是使用CLOB变量时,会收到错误消息“ ORA-01422:精确提取返回的行数超过请求的行数”。 Varchar2出现相同的错误。我的PL / SQL块:

DECLARE
txt_procedure CLOB;

BEGIN

SELECT text INTO txt_procedure
FROM all_source
WHERE name = 'My_procedure'
ORDER BY line;

INSERT INTO TABLE1(ID,DATE,CLOB_COLUMN)
VALUES (my_seq.NEXTVAL,'11.10.2018',txt_procedure);

END;
/ 

如何将过程主体插入clob列?

1 个答案:

答案 0 :(得分:2)

由于您将从查询中获取源代码每一行的多行,因此以下内容可能会有所帮助:

DECLARE
    txt_procedure CLOB;
BEGIN
    FOR source_r IN ( SELECT text 
                        FROM all_source
                       WHERE name = 'My_procedure'
                       ORDER BY line
                    )
    LOOP
        txt_procedure := txt_procedure || chr(10) || source_r.text;
    END LOOP;

    INSERT INTO TABLE1(ID,DATE,CLOB_COLUMN)
    VALUES (my_seq.NEXTVAL,'11.10.2018',txt_procedure);
END;
/ 

更新

或者,您也可以为此使用DBMS_METADATA包:

DECLARE
    txt_procedure CLOB;
BEGIN
    txt_procedure := DBMS_METADATA.get_ddl(
                         object_type => 'PROCEDURE',
                         name        => 'My_procedure',
                         owner       => 'YOUR_SCHEMA'
                     );

    INSERT INTO TABLE1(ID,DATE,CLOB_COLUMN)
    VALUES (my_seq.NEXTVAL,'11.10.2018',txt_procedure);
END;
/