首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-6502,来自WEB

ORA-6502,来自WEB
EN

Stack Overflow用户
提问于 2017-12-01 01:03:11
回答 2查看 60关注 0票数 0

我有一个Oracle DB的问题。

代码语言:javascript
复制
 <?php
    require_once 'includes/conn.php';
    function connect_db()
    {
        if ($c=oci_pconnect(uname,pwd, host,'AL32UTF8'))
            return $c;
        else
            die( "ERROR");
    }
    $conn=connect_db();

    $query = "BEGIN :ds_id :=DS.REG_DS1(:F_NAME);END;";
    $stmt=oci_parse($conn,$query);
    $f_name='John Doe';
    $ds_id=-1;

    oci_bind_by_name($stmt, ":ds_id", $ds_id);
    oci_bind_by_name($stmt, ":F_NAME", $f_name);
    if(oci_execute($stmt))
    {
        echo 'good';
    }
    else
        print_r(oci_error($stmt));
?>

下面是函数REG_DS1

代码语言:javascript
复制
FUNCTION REG_DS1(F_NAME IN VARCHAR) RETURN NUMBER AS
  DS_ID NUMBER(8,0):=9988;
BEGIN
--    INSERT INTO TEST VALUES(F_NAME,SYSDATE);
    RETURN DS_ID;
END REG_DS1;

当我尝试从Sql Developer执行此函数时,它运行时没有任何问题。但是如果我从上面的PHP脚本执行,它会给我错误:

代码语言:javascript
复制
ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512: at line 1 [offset] => 0 [sqltext] => BEGIN :ds_id :=DS.REG_DS1(:F_NAME);END; )

如果我将DS_ID变量更改为另一个小于100的数字,它在这两个变量中都能很好地工作。但是如果我把它设置成一个大于99的数字,它就会从php脚本中得到错误。

会有什么问题呢?

EN

回答 2

Stack Overflow用户

发布于 2017-12-01 12:19:41

--jst idea,这不是solutioN

变量解密或某些定义问题

代码语言:javascript
复制
oci_connect($ODBuser,$ODBpass,$ODBhost,$db_charset);

应该尝试这样的,而不是

oci_pconnect(uname,pwd, host,'AL32UTF8')

示例代码:

代码语言:javascript
复制
-- just idea 
<?php

$file = "../script/param.CML";
$encryptObj = new cast128;
$encryptObj->setkey("SABBIllustrateKey");

$fp=fopen($file,'r');
$strContent = fread($fp, filesize($file));
fclose($fp);

$strContent=$encryptObj->decrypt($strContent);

$ArConnect=split("   ",$strContent);
$OraService=$ArConnect[8];
$OraUser=$ArConnect[9];
$OraDBpass=$ArConnect[10];
$db_charset = 'AL32UTF8';


$cursor=oci_connect($OraUser,$OraDBpass,$OraService,$db_charset);

if(!$cursor)
{
 echo "<br>Error In connection:- reason<BR>";
 $e = oci_error();  // For oci_connect errors pass no handle
}

?>

代码语言:javascript
复制
<?php

$file = "../script/param.CML";
$encryptObj = new cast128;
$encryptObj->setkey("SABBIllustrateKey");

$fp=fopen($file,'r');
$strContent = fread($fp, filesize($file));
fclose($fp);

$strContent=$encryptObj->decrypt($strContent);

$con=split("   ",$strContent);
$OraService=$con[8];
$OraUser=$con[9];
$OraDBpass=$con[10];
$db_charset = 'AL32UTF8';


$cursor=oci_connect($OraUser,$OraDBpass,$OraService,$db_charset);

if(!$cursor)
{
 echo "<br>Error In connection:- reason<BR>";
 $e = oci_error();  // For oci_connect errors pass no handle
}

?>
票数 0
EN

Stack Overflow用户

发布于 2017-12-02 13:18:19

伙计们,我终于自己解决问题了。问题在于返回值的大小可变

通过更改

代码语言:javascript
复制
oci_bind_by_name($stmt, ":ds_id", $ds_id);

代码语言:javascript
复制
oci_bind_by_name($stmt, ":ds_id", $ds_id,10,SQLT_INT );

问题已经解决了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47578824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档