如何使用 OCI 检查插入是否成功


how to check success on insert using OCI

我有以下代码,但我不确定如何检查插入是否成功。 execute返回resource id .我想检查是否成功并在失败时返回所有错误。

public function persist()
  {
    $update = FALSE;
    if(!is_array($this->tablePrimaryKey)) {
        if(!empty($this->fieldVals[$this->tablePrimaryKey])) {
            $update = true;         
        }
    }
    if ($update) {    
      $sql = "UPDATE " . $this->tableName . " SET ";
      $binds = [];
      foreach ($this->fieldVals as $key=>$val) {
        if ($key != $this->tablePrimaryKey) {
            if(in_array($key, $this->DATE_IDS)) {
                $sql .= '"' . strtoupper($key) . '" = sysdate,';
            } else {
                $bind = 't_' . $key;
                $binds[$bind] = $val;   
                $sql .= '"' . strtoupper($key) . '" = :' . $bind . ',';
            }
        }
      }
      $sql = substr($sql,0,-1);
      $sql .= " WHERE " . $this->tablePrimaryKey . " = '" . $this->fieldVals[$this->tablePrimaryKey] ."'";
    } else {
        $binds = $fields = $date_fields = [];
        if(!empty($this->tablePrimaryKey) && !is_array($this->tablePrimaryKey)) {
            $this->fieldVals[$this->tablePrimaryKey] = $this->generateNewPrimaryKey();
        }
        foreach ($this->fieldVals as $key=>$val) {
                $bind = ':t_' . $key;
                if (in_array($key, $this->DATE_IDS)) {
                    $date_fields[] = strtoupper($key);
                } else {
                    $binds[$bind] = $val;
                    $fields[] =  strtoupper($key);
                }   

      } 
      $sql = 'INSERT INTO ' . $this->tableName . '("' . implode('","', $fields);
      if(count($date_fields) >0) {
        $sql .= '","';
        $sql .= implode('","', $date_fields);
      }
      $sql.='") VALUES (' . implode(',', array_keys($binds));
      if(count($date_fields) >0) {
        $cnt=0;
        foreach($date_fields as $date) {
            $cnt++;
            if(preg_match('/NULL/i', $this->fieldVals[strtolower($date)], $result)) {
                $sql .= ",NULL";
            } elseif(isset($this->fieldVals[strtolower($date)])) {
                $sql .= ",TO_DATE('" . (new DateTime($this->fieldVals[strtolower($date)]))->format("Y-M-d H:i:s") . "', 'yyyy/mm/dd hh24:mi:ss')";
            } else {
                $sql .= ",sysdate";
            }
        }
      } 
      $sql .= ')';
    }
    $this->oiDb->parse($sql, $binds);

    return $this->oiDb->execute();

  }

我跑$result = $oiRequests->hydrate($reportingRequest)->persist();. $reportingRequest是键,值对的列/值。 $result包含resource id . $oiRequests是我的模特。

我试过了

$num_rows = oci_fetch_assoc ($result);
            print_r($num_rows);

返回

Warning: oci_fetch_assoc(): ORA-24374: define not done before fetch or execute and fetch in /var/SP/oiadm/docroot/dev/uddins/requestportal/requestportal_ajax.php on line 65

大多数 OCI 函数在出错时返回false。 这意味着您可以对返回值进行简单的检查,如果返回值false,则调用 oci_error()

对于检查 INSERT 语句是否有效的特定情况,您可以参考 oci_commit() 的示例代码。该示例的相关部分在此处重复:

// The OCI_NO_AUTO_COMMIT flag tells Oracle not to commit the INSERT immediately
// Use OCI_DEFAULT as the flag for PHP <= 5.3.1.  The two flags are equivalent
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!$r) {    
    $e = oci_error($stid);
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}