我有一个具有这种结构的Oracle表:
column type key
---------------------------------------------
id integer primary key
user_id integer foreign key
colony_id number(14) foreign key
last_upd_username varchar2(50)
last_upd_date date
我没有创建表,但我认为colony_id
也应该是integer
-而不是number
(现在为时已晚,无法更改它)。
我有一个查询,可以在此表中插入多行:
$colonies = array_map("intval", $post['colonies']);
# Assign colonies to $user_id
$sql = "INSERT INTO user_colonies (
id,
user_id,
colony_id,
last_upd_username,
last_upd_date
) VALUES (
user_colonies_seq.NEXTVAL,
:user_id,
:colony_id,
:username,
sysdate
)";
$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ":user_id", $user_id);
oci_bind_by_name($stmt, ":colony_id", $colony);
oci_bind_by_name($stmt, ":username", $username);
foreach($colonies as $colony) {
$r = oci_execute($stmt, OCI_DEFAULT);
if(!$r) {
$e = oci_error($stmt);
$result['err'][] = $e['message'];
}
}
$result['msg'] = 'success';
oci_commit($conn);
oci_free_statement($stmt);
echo json_encode($result);
这种工作是因为查询运行良好($e['message']
)始终为null
。但是,当我查看插入的行时,colony_id
没有任何意义,它们只是一堆从1到9的随机整数,而我期望的是实际ID(应为数千)。
我能够通过更改使其起作用
oci_bind_by_name($stmt, ":colony_id", $colony);
进入
oci_bind_by_name($stmt, ":colony_id", $colony, -1, OCI_B_INT);
通过使用OCI_B_INT
,将使用正确的ID,并且一切正常。我不明白何时以及如何使用该标志,因为在没有该标志的情况下将OCI_B_INT
绑定到$user_id
效果很好。我可以看到的唯一区别是数据类型(":user_id"
与integer
)。
number(14)
标志确实不是问题。真正的罪魁祸首是OCI_B_INT
参数。
您必须使用OUT绑定时指定
maxlength
,以便PHP分配足够的内存来保存返回的值。对于IN绑定,如果设置了
maxlength
长度,则建议设置该语句用不同的值重新执行了多次PHP变量。否则,Oracle可能会将数据截断到最大长度。初始PHP变量值。如果您不知道最大长度将是,然后使用当前数据大小重新调用maxlength
在每个oci_bind_by_name()
呼叫之前。绑定不必要的大长度将影响数据库中的进程内存。
oci_execute()