我试图使用UPDATE查询对Oracle(12 G)数据库和使用“返回col INTO:var”或“返回col BULK COLLECT INTO:var”clasule和使用它来获得所有ID的列表(PK列)被更新,到PHP变量。我能弄到一个,最后一个,但没有一个名单。
我已经使用oci_bind_array_by_name进行了研究,但收到了错误“警告:Oci_execute():ORA-01484:数组只能绑定到PL/SQL语句”,PHP中接收到的数组为空。
示例(删 debugging 误处理)抛出以上错误:
$db = oci_connect($db_user,$db_password,$db_connection_string);
$bids = '1,2';
$sql = "UPDATE sch.table_name
SET processing_status = '050',
printed_by= :username,
printed_date=current_date,
change_date = sysdate,
change_by = :username
WHERE batch_id in (" . $bids . ")
RETURNING batch_id BULK COLLECT INTO :updated_batch_ids";
$stid = oci_parse($db, $sql);
oci_bind_by_name($stid,':username', $username, -1, SQLT_CHR);
oci_bind_array_by_name($stid,':updated_batch_ids',$updated_batches,1000,50);
oci_execute($stid,OCI_COMMIT_ON_SUCCESS);
oci_free_statement($stid);
//expecting data in $updated_batches, but its empty
我也尝试使用oci_fetch_array或oci_fetch_all(statement),但结果是错误的:“oci_fetch_all():ORA-24374:define not done before fetch or execute and fetch”.
非常感谢您的帮助。最后一点是关于我的挫折感:这将是更容易/可用/记录/解决与Postgre,但必须使用Oracle。
研究和尝试/测试oci_fetch。..、oci_bind_array_by_name、oci_new_collection没有获得期望的结果。
我想DB返回到PHP变量列表或ID数组(PK - batch_ids),这是真正的查询更新。
1条答案
按热度按时间iyzzxitl1#
所以,经过一番调查,我得出了这个结论。它返回一个列,索引(非关联)数组到PHP,但做的工作。我将给予任何人谁会想出如何得到一个以上的列,不同的类型(e。例如,number和varchar)到PHP中的关联数组中。
解决办法是
1.修改查询以创建正确类型的表类型
1.创建该表类型的变量并将数据馈送到该变量中
1.最终将数据提供给PHP中的绑定变量。
另一个问题是OCI要求设置绑定数组的大小(下面代码中为1000)-对我来说有效,但可能不适用于所有应用程序。
在下面的代码中,我通过连接来构造查询,因为在我的环境中($bids的源代码)是安全的,并且之前检查了SQL Inception。此外,代码中的错误处理也被剥离。
查询构造:
连接、解析、绑定、执行和释放: