【问题标题】:How to access in PHP data returned in cursor from postgres function如何访问从 postgres 函数返回的 PHP 数据
【发布时间】:2014-08-29 13:32:08
【问题描述】:

Postgres 函数:

CREATE OR REPLACE FUNCTION lcp_product_find(IN pi_prd_code text DEFAULT NULL::text, OUT  po_cursor refcursor, OUT po_err_num integer, OUT po_err_desc text)
RETURNS record AS
$BODY$  
DECLARE
v_proc_name text;
v_prd_id integer;
BEGIN
v_proc_name := 'lcp_product_find';
po_cursor := 'po_cursor';

-- some selects from lct_products table

OPEN po_cursor FOR 
    select "PRD_ID", "PRD_FAMILY", "PRD_NAME", "PRD_DESC", "PRD_BRAND", 
    "PRD_MODEL", "PRD_STATUS", "PRD_AUDIT_CD", "PRD_AUDIT_MD", "PRD_CODE" 
    from lct_products where "PRD_ID" = v_prd_id;
    RETURN;

END;
$BODY$
LANGUAGE plpgsql VOLATILE

一般情况下,函数返回光标中的产品数据(如果找到任何数据),如果发生错误,还会返回 err_number 和 err_desc。

现在我想从 po_cursor 中的函数返回的 PHP 数据中访问。我正在做的是:

<?php
$conn = new PDO("pgsql:host=localhost;port=5432;dbname=name", "user", "pas");

$conn->beginTransaction();

$prd_code = $_POST['prd_code'];     //echo $prd_code;

// call the function
$stmt = $conn->prepare("select lcp_product_find(:pi_prd_code)");
$stmt->bindParam('pi_prd_code', $prd_code, PDO::PARAM_STR);
$stmt->execute();
$cursors = $stmt->fetchAll();
$stmt->closeCursor();

?>

结果我收到了这样的东西:

Array
(
[0] => Array
    (
        [lcp_product_find] => (po_cursor,,)
        [0] => (po_cursor,,)
    )

)

你能帮我解决这个问题吗?我做错了什么,我没有在 po_cursor 中返回数据?不用PDO也可以吗?

【问题讨论】:

    标签: php postgresql pdo


    【解决方案1】:

    SQL 游标一旦打开并返回到 php,就必须通过 SQL 语句FETCHMOVECLOSE...通过其名称来处理。此功能不是作为 PDO 函数实现的,而且在数据库之间不兼容。

    PDOStatement::closeCursor 指的是与您的上下文无关的客户端游标。

    例子:

    $s = $db->query("FETCH ALL FROM po_cursor");
    $rows = $s->fetchAll();
    $db->query("CLOSE po_cursor");
    

    如果使用动态游标名称,请注意它们在语法上是 SQL 标识符,这意味着如果不是严格的字母数字,它们必须与列名或表名一样被引用,并且如果不是,它们不区分大小写引用。

    pg_escape_identifier 为 pg_* API 实现了此引用,但 PDO 中似乎没有等效函数。

    当程序不命名游标时,PostgreSQL 会生成像 &lt;unnamed portal 1&gt; 这样的名称,其空格需要在可注入查询之前整体引用,例如:

    fetch all from "<unnamed portal 1>"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 2011-02-21
      • 2010-11-30
      • 2019-02-06
      • 1970-01-01
      相关资源
      最近更新 更多