如何从postgres函数访问游标中返回的PHP数据

时间:2014-08-29 13:32:09

标签: php postgresql pdo

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的情况下完成吗?

1 个答案:

答案 0 :(得分:0)

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会生成类似<unnamed portal 1>的名称,其空格在被注入查询之前需要整体引用,例如:

fetch all from "<unnamed portal 1>"