更新ORACLE表并将更新行的ID(PK)返回给PHP

gmol1639  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(208)

我试图使用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),这是真正的查询更新。

iyzzxitl

iyzzxitl1#

所以,经过一番调查,我得出了这个结论。它返回一个列,索引(非关联)数组到PHP,但做的工作。我将给予任何人谁会想出如何得到一个以上的列,不同的类型(e。例如,number和varchar)到PHP中的关联数组中。
解决办法是
1.修改查询以创建正确类型的表类型
1.创建该表类型的变量并将数据馈送到该变量中
1.最终将数据提供给PHP中的绑定变量。
另一个问题是OCI要求设置绑定数组的大小(下面代码中为1000)-对我来说有效,但可能不适用于所有应用程序。
在下面的代码中,我通过连接来构造查询,因为在我的环境中($bids的源代码)是安全的,并且之前检查了SQL Inception。此外,代码中的错误处理也被剥离。
查询构造:

$sql = "DECLARE
    --declare table type
    TYPE batch_id_array IS TABLE OF myschema.mytable.batch_id%TYPE INDEX BY BINARY_INTEGER;
    l_batch_ids batch_id_array; --variable used to RETURN into
BEGIN 
    UPDATE myschema.mytabe
        SET processing_status = '050',
            printed_by= :username,
            printed_date=current_date,
            WHERE batch_id in " . $bids  . "
        RETURNING
            batch_id
        BULK COLLECT INTO l_batch_ids;
    :batch_ids := l_batch_ids; --set binded variable
END;";

连接、解析、绑定、执行和释放:

$stid = oci_parse($db, $sql);
oci_bind_by_name($stid,':username', $username, -1, SQLT_CHR);
#bind array - output variable
oci_bind_array_by_name($stid, ':batch_ids', $batch_ids, 1000,-1, SQLT_INT);
#execute and free statement
oci_execute($stid,OCI_COMMIT_ON_SUCCESS);
oci_free_statement($stid);

# $batch_bids is now indexed array of integers with updated batch_ids
var_dump($batch_bids);

相关问题