当前位置: 首页 > 知识库问答 >
问题:

ORA-06502: PL/SQL:数字或值错误:字符串缓冲区太小-使用OCI接口执行

林子石
2023-03-14

我完全震惊了,不明白我需要做什么来修复这个错误。我有一个plsql过程,它接受一个varchar2字符串和一个OUT参数,这是一个数字。你能帮我学习plsql和php吗。

member_name列类型为VARCHAR2(100),member_id为NUMBER(20)

create or replace procedure GET_MEMBER_ID (V_MEMBER_NAME IN  VARCHAR2,V_MEMBER_ID OUT NUMBER ) AS 
BEGIN
SELECT member_id INTO V_MEMBER_ID
FROM mn_member WHERE member_name = V_MEMBER_NAME;
END;
/

我从php执行上述存储过程,如下所示

   error_reporting(E_ALL);
   ini_set('display_errors', 1);
   $conn = oci_connect("$user","$password","$sid");

   $MEMBER_ID=0;
   $MEMBER_NAME='45390';
   echo gettype($MEMBER_NAME), "\n";
   echo gettype($MEMBER_ID), "\n";

   $sql_get_member_id = "BEGIN GET_MEMBER_ID(:MEMBER_NAME,:MEMBER_ID);END;";
   $stmt1 = oci_parse($conn,$sql_get_member_id);

   //  Bind the input parameter
   oci_bind_by_name($stmt1,':MEMBER_NAME',$MEMBER_NAME);
   oci_bind_by_name($stmt1,':MEMBER_ID',$MEMBER_ID);

   oci_execute($stmt1);
   echo "Member ID is ".$MEMBER_ID;
?>

这是我在php中看到的输出

字符串整数警告:oci_execute()[function.oci execute]:ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小ORA-06512:在rtp2/test的第1行。第26行的php成员ID为0

共有1个答案

富钧
2023-03-14

我不是PHP高手,但从文档来看:

“使用外绑定时必须指定maxlength,以便PHP分配足够的内存来保存返回值。”

也许可以尝试以下方式:

   //  Bind the input parameter
   oci_bind_by_name($stmt1,':MEMBER_NAME',$MEMBER_NAME);
   oci_bind_by_name($stmt1,':MEMBER_ID',$MEMBER_ID,20,SQLT_INT);

不确定SQLT_INT数据类型规范的必要性。

 类似资料: