我完全震惊了,不明白我需要做什么来修复这个错误。我有一个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
我不是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数据类型规范的必要性。
我以不同的方式尝试了以下代码,比如去掉while或if,但是当我把它们放在一起(if和while)时,我总是在最后得到错误。。。 错误: 通过将变量“a”的声明方式更改为: *注意,这里的显著变化是使用VARCHAR2而不是CHAR(不是更大的长度)。根据@user272735的回答,这是关键。
我在下面的字段上得到字符串缓冲区太小的错误。 位于导致错误的select语句中。它是数据类型。
我在游标循环中连接varchar2数据类型时遇到了问题。 过程在循环中迭代,以生成用于批处理的插入和删除操作的in子句。该过程将对每1000个帐号批处理运行。 有没有其他方法可以做到这一点?
我得到这样的错误:错误:ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小
有没有办法在mybatis结果映射中指定一个字符串最多应包含20个字符?或者如何设置精度,如数字(4,2)? 例如,我有一个如下所示的结果图: 我可以将int的位数限制为只有1,在浮点数上的“.”后面显示N个元素,或者将字符串大小限制为一定的数字吗? 我正在处理的视图具有以下列结构: 编辑1:每当我试图调用存储过程在此视图中添加新项时...我会得到这个错误: 我创建了一个用于测试的类,该类尝试调用
在函数中,我在这一行上有ORA-06502错误: 我看这里没有任何转换问题/完全困惑/