2014-08-29 4 views
0

포스트 그레스 함수에서 커서를 반환 PHP 데이터에 액세스하는 방법 :는 포스트 그레스 기능

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(); 

?> 

그렇게 STH :

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

) 

는 당신이 밖으로 정렬 나를 도와 드릴까요? 내가 po_cursor에서 반환 된 데이터를 얻지 못한다면 무엇을 잘못하고 있습니까? PDO없이 수행 할 수 있습니까?

답변

0

일단 SQL 커서를 열고 PHP로 반환하면 SQL 문 FETCH, MOVE, CLOSE ... 등의 이름으로 처리해야합니다. 이 기능은 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에는 동등한 기능이없는 것으로 보입니다.

fetch all from "<unnamed portal 1>" 
: 프로그램이 커서의 이름을 지정하지 않는 경우

, PostgreSQL는 공간과 같은 쿼리로 주사되기 전에 전체 인용 필요 <unnamed portal 1>, 같은 이름을 생성