当字符超过 32K 时,Oracle XMLAGG 不起作用
Oracle XMLAGG doesn't work when characters are more than 32K
为存储过程中声明的 clob 变量赋值时出现以下错误。当我 运行 查询 SQL Developer.
时同样有效
这是我目前在我的存储过程中使用的查询:
SELECT
RTRIM(XMLAGG(XMLELEMENT(E, col1, chr(10)).EXTRACT('//text()')).GetClobVal(),',')
INTO CLOB_VAR
FROM Table1**
我不明白为什么它会导致诸如数字或值错误之类的错误。
错误报告-
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "XXXXXX.TMP_STORED_PROC", line 39
ORA-06512: at line 1
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause: An arithmetic, numeric, string, conversion, or constraint error
occurred. For example, this error occurs if an attempt is made to
assign the value NULL to a variable declared NOT NULL, or if an
attempt is made to assign an integer larger than 99 to a variable
declared NUMBER(2).
*Action: Change the data, how it is manipulated, or how it is declared so
that values do not violate constraints.
存储过程:
create or replace PROCEDURE TMP_STORE_PROC () IS
CLOB_TEXT CLOB;
start_timestamp TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
ERR_CODE VARCHAR2(20);
ERR_MSG VARCHAR2(500);
BEGIN
SAVEPOINT startTransaction;
SELECT RTRIM(XMLAGG(XMLELEMENT(E, col1, chr(10)).EXTRACT('//text()')).GetClobVal(),',') INTO CLOB_TEXT FROM Table1
DBMS_OUTPUT.PUT_LINE('################ String length -- '||TO_CHAR(CLOB_TEXT));
COMMIT;
NULL;
EXCEPTION
WHEN OTHERS THEN
ERR_CODE := SQLCODE;
ERR_MSG := SQLERRM;
DBMS_OUTPUT.PUT_LINE('Stored procedure failed in execution. Error Message : '||ERR_CODE||' -- MSG -- '||ERR_MSG);
ROLLBACK TO startTransaction;
RAISE;
END;
替换
DBMS_OUTPUT.PUT_LINE('################ String length -- '||TO_CHAR(CLOB_TEXT));
与以下
DBMS_OUTPUT.put_line ( '################ String length -- ' || length(clob_text));
程序
CREATE OR REPLACE PROCEDURE tmp_store_proc
IS
clob_text CLOB;
start_timestamp TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
err_code VARCHAR2 (20);
err_msg VARCHAR2 (500);
BEGIN
SAVEPOINT starttransaction;
SELECT RTRIM (
XMLAGG (XMLELEMENT (e, col1, CHR (10)).EXTRACT ('//text()')).getclobval (),
',')
INTO clob_text
FROM table1;
DBMS_OUTPUT.put_line (
'################ String length -- ' || LENGTH (clob_text));
COMMIT;
NULL;
EXCEPTION
WHEN OTHERS
THEN
err_code := SQLCODE;
err_msg := SQLERRM;
DBMS_OUTPUT.put_line (
'Stored procedure failed in execution. Error Message : '
|| err_code
|| ' -- MSG -- '
|| err_msg);
ROLLBACK TO starttransaction;
RAISE;
END;
通过
执行程序
exec tmp_store_proc
输出
########## String length -- 18224744
如果您想打印 CLOB,请查看 this
为存储过程中声明的 clob 变量赋值时出现以下错误。当我 运行 查询 SQL Developer.
时同样有效这是我目前在我的存储过程中使用的查询:
SELECT
RTRIM(XMLAGG(XMLELEMENT(E, col1, chr(10)).EXTRACT('//text()')).GetClobVal(),',')
INTO CLOB_VAR
FROM Table1**
我不明白为什么它会导致诸如数字或值错误之类的错误。
错误报告-
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "XXXXXX.TMP_STORED_PROC", line 39
ORA-06512: at line 1
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause: An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).
*Action: Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.
存储过程:
create or replace PROCEDURE TMP_STORE_PROC () IS
CLOB_TEXT CLOB;
start_timestamp TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
ERR_CODE VARCHAR2(20);
ERR_MSG VARCHAR2(500);
BEGIN
SAVEPOINT startTransaction;
SELECT RTRIM(XMLAGG(XMLELEMENT(E, col1, chr(10)).EXTRACT('//text()')).GetClobVal(),',') INTO CLOB_TEXT FROM Table1
DBMS_OUTPUT.PUT_LINE('################ String length -- '||TO_CHAR(CLOB_TEXT));
COMMIT;
NULL;
EXCEPTION
WHEN OTHERS THEN
ERR_CODE := SQLCODE;
ERR_MSG := SQLERRM;
DBMS_OUTPUT.PUT_LINE('Stored procedure failed in execution. Error Message : '||ERR_CODE||' -- MSG -- '||ERR_MSG);
ROLLBACK TO startTransaction;
RAISE;
END;
替换
DBMS_OUTPUT.PUT_LINE('################ String length -- '||TO_CHAR(CLOB_TEXT));
与以下
DBMS_OUTPUT.put_line ( '################ String length -- ' || length(clob_text));
程序
CREATE OR REPLACE PROCEDURE tmp_store_proc
IS
clob_text CLOB;
start_timestamp TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
err_code VARCHAR2 (20);
err_msg VARCHAR2 (500);
BEGIN
SAVEPOINT starttransaction;
SELECT RTRIM (
XMLAGG (XMLELEMENT (e, col1, CHR (10)).EXTRACT ('//text()')).getclobval (),
',')
INTO clob_text
FROM table1;
DBMS_OUTPUT.put_line (
'################ String length -- ' || LENGTH (clob_text));
COMMIT;
NULL;
EXCEPTION
WHEN OTHERS
THEN
err_code := SQLCODE;
err_msg := SQLERRM;
DBMS_OUTPUT.put_line (
'Stored procedure failed in execution. Error Message : '
|| err_code
|| ' -- MSG -- '
|| err_msg);
ROLLBACK TO starttransaction;
RAISE;
END;
通过
执行程序exec tmp_store_proc
输出
########## String length -- 18224744
如果您想打印 CLOB,请查看 this