2013-03-14 1 views
0

"RAISE EXCEPTION"문의 "부분"이 PDOException의 "부분"으로 매핑되는 것을 파악하려고합니다. 어떤 사람이 "누가"및 "어떻게"이 변환을 수행하는지 설명 할 수 있습니까? (또는 이것을 수행하는 소스 코드 또는 소스 코드를 설명하는 문서를 가리 키십시오.)Postgres의 "RAISE EXCEPTION"은 PDOException으로 어떻게 변환됩니까?

더 구체적으로, SQLSTATUS 값 (내 테스트에서 항상 'P0001') 및/또는 'ERROR :'값 (메시지의 일부이며 항상 비어 있음)에 영향을 줄 수있는 방법이 있는지 알고 싶습니다.)

내가 관리 할 수있는 베스트이다 :

PHP에면이 나에게 같은 메시지를 제공
 
RAISE EXCEPTION USING message = '<a message>', ERRCODE = 'UE001' 

:

 
ERROR: NUM:UE001, DETAILS:<a message> 

을하지만이 매우 행복하지 않다. 'UE001'을 PDOException 필드 중 하나에 "넣을 수있는 것이 좋을 것입니다 (메시지 문자열에서 파싱 할 필요가 없습니다).

귀하의 의견은 높이 평가 될 것입니다.

+0

* 항상 * 코드와 PostgreSQL 버전을 보여주십시오. –

답변

2

속성을 PDOException으로 설정하면 SQLSTATE이됩니다. the documentation for PDOException

오류를 발생시키는 PL/PgSQL 함수에 의해 생성 된 SQLSTATE을 제어하려면 RAISE ... SQLSTATE as per the documentation을 사용합니다.

물론이 작업을 수행하려면 데이터베이스 드라이버가 SQLSTATE을 올바르게보고해야합니다.

<?php 
$pdo = new PDO('pgsql:'); 

$sql = <<<EOD 
CREATE OR REPLACE FUNCTION exceptiondemo() RETURNS void AS $$ 
BEGIN 
    RAISE SQLSTATE 'UE001' USING MESSAGE = 'error message'; 
END; 
$$ LANGUAGE plpgsql 
EOD; 

$sth = $pdo->prepare($sql); 
if (!$sth->execute()) { 
     die("Failed to create test function\n"); 
} 

$sql = "SELECT exceptiondemo();"; 

$sth = $pdo->prepare($sql); 
if (!$sth->execute()) { 
     $ei = $sth->errorInfo(); 
     die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n"); 

     // Shortcut way: 
     // die("Function call failed with SQLSTATE " . $sth->errorCode()); 
} 
?> 

출력은 다음과 같습니다 :

Function call failed with SQLSTATE UE001, message ERROR: error message 
나는 PDO는 php 명령 줄 실행 파일을 실행 할 수있는 다음과 같은 독립 예제 코드에 따라, PostgreSQL의 9.2과 PHP 5.4.11 적어도이 작업을 수행하는 것을 확인했다

예외 처리 모드가 너무 잘 작동 함을 입증하기 위해 함께 코드의 끝에 제 $sth->execute()의 코드 블록을 교체 :

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
     $sth->execute(); 
} catch (PDOException $err) { 
     $ei = $err->errorInfo; 
     die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n"); 

     // Alternate version to just get code: 
     //die("Function call failed with SQLSTATE " . $err->getCode() . "\n"); 
} 
+0

@AndreiTchijov 답변이 수정되었습니다. –

+0

@AndreiTchijov 당신은 RAISE에서 사용자 정의 SQLSTATE를 지원하지 않는 오래된 PostgreSQL 버전 일 가능성이 있습니까? PostgreSQL 버전은 무엇입니까? (당신은 항상 질문에서 이것을 언급해야합니다). –

+0

@AndreiTchijov 위의 편집 된 답변에 나와있는 것처럼 잘 작동하기 때문에 문제를 설명하는 완전히 자체적 인 코드 예제를 보여주십시오. PHP 버전, Pg 버전 및 플랫폼을 지정하십시오. –

관련 문제