【问题标题】:PHP Oracle transaction insert errorPHP Oracle 事务插入错误
【发布时间】:2014-05-08 12:58:31
【问题描述】:

我在这件事上浪费了足够多的时间,我需要你的帮助。这可能是一个简单的疏忽,但我使用此功能连接到 Oracle 数据库并执行事务:

function transaction($query, $loop, $read_only, $return_vals){
     $DEBUG = 'yes';

    $db_name_idde = "server";
    $db_user_idde = "schema";
    $db_pass_idde = "password";

    $connection = oci_new_connect($db_user_idde, $db_pass_idde, $db_name_idde);

    $return_vars = array();

    //foreach always needs an array
    if( gettype($query) == 'string'){
        $query = array(0 => $query);
    }

    foreach($query as $statement){

        $stid = oci_parse($connection, $statement);

        if (!$stid && $DEBUG == "yes") {
            die(oci_error($connection));
        } else if (!$stid) {
            die('Could Not Execute Query.');
        }


        if ( !oci_execute($stid, OCI_DEFAULT) && $DEBUG == "yes") {

        // If we have a problem, rollback then die
            oci_rollback($connection);
            oci_close($connection);

            die($statement);
            //die(oci_error($stid));
        } else if ( !oci_execute($stid, OCI_DEFAULT) ) {
            oci_rollback($connection);
            oci_close($connection);

            die('Could Not Execute Query.');
        }
    }

    oci_commit($connection);
    oci_close($connection);

    // See if we need to send the results back
    if ($return_vals) {
        if ($loop) {
            $i = 0;
            while ($row = oci_fetch_array($stid, (OCI_RETURN_NULLS+OCI_ASSOC))) {
                $return_vars[$i] = $row;

                $i ++;
            }
        } else {
            $return_vars = oci_fetch_array($stid, (OCI_RETURN_NULLS+OCI_ASSOC));
        }
    } else {
        //$return_vars = mysql_insert_id($connection);
    }

    global $db_num_results;
    global $zero;
    $db_num_results = $i;
    $zero = 0;

    return $return_vars;
}

现在这个函数可以处理更新,但总是失败,插入、INSERT INTO 或 INSERT ALL,声明随机生成的 OBJECTID 的重复键。我开始改用 mt_rand,它生成的 ID 比数据库中的任何东西都长得多,所以它根本不应该提出这个声明:

INSERT ALL

INTO table1 (OBJECTID, OUTFALL_ID, INVESTIGATION_ID, LOGGED_DATE,LOGGED_BY,ASSET_ID,SOURCE,COMMENTS,STATUS, CREATED_BY, CREATED_DATE) 
VALUES ( 1314897731, '10C10010', TO_CHAR(SYSDATE, 'YYYY') || '-' || sequence.NEXTVAL,  TO_DATE('05/15/2014','mm/dd/yyyy'),'person','','Sample','','Open', 'a@b.com', SYSDATE)

INTO table2 (OBJECTID, OUTFALL_ID, INVESTIGATION_ID, TASK_DATE,TASK_TIME,ENTERED_BY,TASK_TYPE,DOCUMENT_LINK,SUMMARY, CREATED_BY, CREATED_DATE) 
VALUES ( 1314897731, '10C10010', TO_CHAR(SYSDATE, 'YYYY') || '-' || sequence.CURRVAL,  TO_DATE('05/24/2014','mm/dd/yyyy'),'','person','Initial Inspection','','', 'a@b.com', SYSDATE) SELECT * FROM DUAL 

但是,当我在 TOAD 中运行此语句时,没有任何投诉,也不应该考虑我生成的新 ID 的大小至少是当前 ID 的 10 倍。也许我在那里留下了一些 PL/SQL,或者它不小心重复了。我不知道。

【问题讨论】:

  • 这是什么语言?
  • 哎呀忘了在标题中,它的 PHP。
  • 为什么不使用 oracle 序列作为 objectid?
  • 因为 OBJECTID 将在以后提供,所以我现在只是使用一个随机数作为必填字段的占位符。
  • 这些语句让我感到困惑:您插入 table1 (一个表)并且在 values 子句中,其中一个值是 table1.NEXTVAL (一个序列伪列)。 table1 是表还是序列?在 table2 插入中,您使用 CURRVAL。

标签: php sql oracle


【解决方案1】:

罪魁祸首是这样的:

!oci_execute($stid, OCI_DEFAULT)

由于某种原因,这会导致唯一约束错误,考虑到它返回 true/false 并且可以在 if 语句的条件中使用,这是不寻常的。将其更改为

$r = oci_execute($stid, OCI_DEFAULT);
if(!$r && $DEBUG == 'YES'){

删除了错误。这并不能解释为什么更新可以正常工作,但自从我实施此更改以来,我没有遇到任何麻烦。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2017-09-09
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多