Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plsql Oracle-在CLOB中存储大字符串_Plsql_Oracle11g - Fatal编程技术网

Plsql Oracle-在CLOB中存储大字符串

Plsql Oracle-在CLOB中存储大字符串,plsql,oracle11g,Plsql,Oracle11g,我需要使用变量将过程主体保存到Clob列中。字符串长度超过4000个字符,因此我不能使用VarChar2,但使用CLOB变量时,我收到错误“ORA-01422:exact fetch返回的行数超过请求的行数”。Varchar2也会出现同样的错误。我的PL/SQL块: DECLARE txt_procedure CLOB; BEGIN SELECT text INTO txt_procedure FROM all_source WHERE name = 'My_procedure' ORDER

我需要使用变量将过程主体保存到Clob列中。字符串长度超过4000个字符,因此我不能使用VarChar2,但使用CLOB变量时,我收到错误“ORA-01422:exact fetch返回的行数超过请求的行数”。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列?

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

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_元数据包:

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;
/ 

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

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_元数据包:

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;
/ 

您确定对源“My_过程”的查询只返回一行吗?@DanielFrech,不,我没有返回一行,这是真的。但我需要所有的程序文本并将其插入clob,这就是重点。我没有找到其他东西,然后从所有来源中选择。好的,我添加了一个答案。希望有帮助。您确定对源代码“My_过程”的查询只返回一行吗?@DanielFrech,不,我没有返回一行,这是真的。但我需要所有的程序文本并将其插入clob,这就是重点。我没有找到其他东西,然后从所有来源中选择。好的,我添加了一个答案。希望有帮助。就这样,非常感谢!我一直在尝试各种东西,但没有想到一个循环。好的,丹尼尔,回答得很好。成功了,非常感谢!我一直在尝试各种各样的东西,但没有想到一个循环。很好,丹尼尔,回答得很好。