ORA-06502: PL / SQL: ошибка числового значения или значения: слишком маленький буфер строки символов при вызове PLSQL

Я начал получать сообщение об ошибке ниже, так как я добавил o_ID к процедуре, все работало нормально, пока я не добавил в o_IDэто связано с o_ID быть установленным как неправильный тип данных возможно? Я просмотрел любые другие связанные темы на SO, но безрезультатно.

o_ID изначально устанавливается, как показано ниже PR_LOAD_XML_FILEназывается:

$id = 0;
$stmt->bindParam('o_ID', $id);

Из журналов

2015-12-18T13:02:06+00:00 ERR (3): An exception occurred while executing 'BEGIN PR_LOAD_XML_FILE (
i_XML => :i_XML,
i_FILENAME => :i_FILENAME,
o_ID => :o_ID,
on_ErrorID => :on_ErrorID
);
END;' with params ["<?xml version=\"1.0\" encoding=\"UTF-8\" ?><test><TestDetails><TestVersionId>3244<\/TestVersionId><Marks>20<\/Marks><\/TestDetails><\/test>", "test.csv"]:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 1

Процедура Spec

PROCEDURE PR_LOAD_XML_FILE (
i_XML IN CLOB,
i_FILENAME IN XML_DOC.FILENAME%TYPE,
o_ID OUT NUMBER,
on_ErrorID OUT INTEGER
);

Тело процедуры

PROCEDURE PR_LOAD_XML_FILE (
i_XML IN CLOB,
i_FILENAME IN XML_DOC.FILENAME%TYPE,
o_ID OUT NUMBER,
on_ErrorID OUT INTEGER
) IS
doc_id XML_DOC.id%TYPE;
xml        XMLTYPE;
BEGIN
...
END PR_LOAD_XML_FILE;

1

Решение

Я думаю, что когда вы вызываете свою процедуру, вы устанавливаете переменную для получения значения o_ID в виде строки. Вот мой пакет, который издевается над твоим:

CREATE OR REPLACE PACKAGE PKG_PR_LOAD_XML_FILE
AS
PROCEDURE PR_LOAD_XML_FILE (
i_XML IN CLOB,
i_FILENAME IN varchar2,
o_ID OUT NUMBER,
on_ErrorID OUT INTEGER );
END PKG_PR_LOAD_XML_FILE;
/
CREATE OR REPLACE PACKAGE BODY PKG_PR_LOAD_XML_FILE
AS
PROCEDURE PR_LOAD_XML_FILE (
i_XML IN CLOB,
i_FILENAME IN varchar2,
o_ID OUT NUMBER,
on_ErrorID OUT INTEGER )
IS

BEGIN
dbms_output.put_line( 'i_XML: '||i_XML );
dbms_output.put_line( 'i_FILENAME: '||i_FILENAME );
o_ID := 999999;
on_ErrorID := 123456789;
END PR_LOAD_XML_FILE;
END PKG_PR_LOAD_XML_FILE;
/

В SQL * Plus я сначала определю эти две переменные связывания. Обратите внимание, что для переменной bind v_o_ID установлено значение varchar2 (4). Это предназначено для потерпеть поражение потому что значение o_ID установлено в 999999 в процедуре, которая длиннее 4 символов (если значение o_ID было установлено равным 9999, что составляет 4 символа или менее, то вызов процедуры работал бы нормально, но ошибка все равно будет присутствовать, и будет появляться Вы, как только значение o_ID станет больше 4 символов):

SQLPlus> var v_o_ID varchar2(4)
SQLPlus> var v_on_ErrorID number

Теперь я вызываю процедуру в SQL * Plus, и она будет потерпеть поражение:

SQLPlus> exec PKG_PR_LOAD_XML_FILE.PR_LOAD_XML_FILE( '<heres my XML>', 'heresfilename.csv', :v_o_ID, :v_on_ErrorID);
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 1

Теперь я установлю переменную связывания v_o_ID в число, и вызов процедуры будет успех. Вы можете увидеть полученные значения из процедуры, если вы печатаете переменные связывания, используя print команда:

SQLPlus> var v_o_ID number

SQLPlus> exec PKG_PR_LOAD_XML_FILE.PR_LOAD_XML_FILE( '<heres my XML>', 'heresfilename.csv', :v_o_ID, :v_on_ErrorID);
i_XML: <heres my XML>
i_FILENAME: heresfilename.csv

PL/SQL procedure successfully completed.
SQLPlus> print v_o_ID
V_O_ID
----------
999999

SQLPlus> print v_on_ErrorID
V_ON_ERRORID
------------
123456789
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]