2014-08-29 35 views
0

Postgres的函数指针返回PHP数据访问:如何从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(); 

?> 

因此,我recive折腾这样的:

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

) 

你能不能帮我整理中说出来?我在做什么错,我没有得到po_cursor中返回的数据?它可以在没有PDO的情况下完成吗?

回答

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标识符,syntaxically,这意味着它们必须被引用相同的列或时没有严格的字母数字表的名称,当没有引用时,它们不区分大小写。

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

当程序不名的游标,PostgreSQL的产生一样<unnamed portal 1>,其空间需要被注射到查询,像以前一样整体报价名称:

fetch all from "<unnamed portal 1>"