Php ORA-06502:PL/SQL:数字或值错误:调用PLSQL时字符串缓冲区太小

Php ORA-06502:PL/SQL:数字或值错误:调用PLSQL时字符串缓冲区太小,php,oracle,plsql,Php,Oracle,Plsql,自从我在过程中添加了o\u ID之后,我开始出现以下错误,在我添加o\u ID之前,一切都正常,这可能与o\u ID被设置为错误的数据类型有关吗?我已经看过了关于SO的任何其他相关话题,但都没有用 在调用PR\u LOAD\u XML\u文件之前,o\u ID初始设置如下: $id = 0; $stmt->bindParam('o_ID', $id); 从日志中 2015-12-18T13:02:06+00:00 ERR (3): An exception occurred while

自从我在过程中添加了
o\u ID
之后,我开始出现以下错误,在我添加
o\u ID
之前,一切都正常,这可能与
o\u ID
被设置为错误的数据类型有关吗?我已经看过了关于SO的任何其他相关话题,但都没有用

在调用
PR\u LOAD\u XML\u文件之前,
o\u ID
初始设置如下:

$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
程序主体

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;

我认为当您调用过程时,您正在设置变量以接收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的值在过程中设置为9999999,长度超过4个字符(如果o_ID的值设置为9999,即4个字符或更少,则过程调用将正常工作,但错误仍然存在,并且当o_ID的值大于4个字符时,它将立即向您蔓延):

现在我在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

请确定,如果您直接从SQL工作表中使用相同的参数调用它,此过程是否有效?我以前遇到过此问题,因为调用代码中的变量声明的大小不足以容纳Oracle想要给它的返回值。请确保在声明$id时,为其指定了适当的大小。可能是bly是clob或filename字段,而不是ID。事实就是这样,变量最初没有设置为足够大的值来接受过程返回的数字。根据这一点,最好指定
PDO::PARAM_INPUT_OUTPUT
bindParam
?@Timekiller的第三个和第四个参数的变量大小使用一个旧的自定义框架,因此必须使其与现有代码保持内联,但您有权这样做,正确的方法是使用PDO参数。
SQLPlus> var v_o_ID varchar2(4)
SQLPlus> var v_on_ErrorID number
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
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