【发布时间】: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。