2013-04-11 2 views
2

ORM이 없으므로 DBAL을 독립 실행 형으로 사용하고 있습니다. 그러나 나는 쿼리에서 오라클 키워드를 사용하여 몇 가지 문제가 있습니다.Doctrine DBAL 및 Oracle 키워드

ORA-01722: invalid number 

내가 때문에 순서의 사용의 가정 : 나는 다음과 같은 오류가 발생합니다,

$journal = array(
    'LGM_ID'  => 'SEQ_JOURNAL.NEXTVAL', 
    'LGM_USER_LOGIN' => "a user", 
    'LGM_DATE'  => 'CURRENT_TIMESTAMP' 
); 
$db->insert('JOURNAL', $journal); 

그리고이 작동하지 않습니다 는 예를 들어 나는 다음과 같은 코드가 있습니다. 정수와 배열의 첫 번째 항목을 교체 한 후, 나는 다음과 같은 오류가 있습니다

ORA-01858: a non-numeric character was found where a numeric was expected 

내가 때문에 CURRENT_TIMESTAMP 키워드의 생각이 시간.

나는 쿼리 키워드를 전달할 때 문자열로 변환되어 작동하지 않는다고 생각합니다. ORM과 같은 특별한 것들을 사용하지 않고 시퀀스 나 다른 키워드를 사용할 수 있습니까?

시퀀스의 경우 nextval을 얻기 전에 다른 요청을 실행할 수 있다고 생각합니다. 그러나 CURRENT_TIMESTAMP의 경우 PHP DateTime을 사용하고 싶지 않습니다. 날짜가 시간대가 지정되어있어 오라클이 완벽하게 처리하는 함수에 대해 너무 많은 추가 코드를 추가하기 때문입니다.

내가 가진 마지막 해결책은 전체 쿼리를 문자열로 작성하고 $ db-> query (...)를 사용하는 것이지만 추상화 계층의 목표는 아닙니다.

도움을 주셔서 감사합니다.

+0

'$ db-> insert ('JOURNAL', $ journal);가 Oracle에 보내는 SQL 문을 로깅 할 수 있습니까? –

+0

안녕하세요, 나는 DBAL에 대해 매우 익숙하므로 쉽게이 작업을 수행하는 방법을 모르겠습니다. 나는 문서를 확인하고 가능한 빨리 돌아올 것입니다. – user1923976

답변

0

원하는대로 새 메모의 서식을 지정할 수 없으므로 마지막 메모에 답변하고 있습니다. 내가 DBAL으로 로그인 할 수 있습니다

모두는 이것이다 : 요청과 매개 변수 :

INSERT INTO JOURNAL (LGM_TYPE, LGM_SUBTYPE, LGM_OBJECT_ID, LGM_OBJECT_TABLE, LGM_DATA, LGM_ID, LGM_USER_LOGIN, LGM_DATE) VALUES (?, ?, ?, ?, ?, ?, ?, ?) 

Array 
( 
    [0] => 3 
    [1] => 0 
    [2] => 245 
    [3] => ENTITY 
    [4] => Deletion of specific entity 
    [5] => 1 
    [6] => user 
    [7] => CURRENT_TIMESTAMP 
) 

나는 우리가 문자열로 정확한 쿼리를 얻을 수 있습니다 모르겠어요.

1

나는 CURRENT_TIMESTAMP이 어떻게 행동하는지 모르겠지만, 확실한 것은 시퀀스의 문자열이 오류를 생성한다는 것입니다.

Doctrine (또는 PDO는 가치가 있습니다)은 SEQ_JOURNAL.NEXTVAL 문자열을 LGM_ID 열에 간단히 바인딩합니다.

내가 아는 한이 문제를 처리 할 수있는 두 가지 방법이 있습니다.

첫 번째 방법

증가 첫번째 순서의 가치와 그것을 얻을 :

$journal = array(
    'LGM_ID' => $id, 
    'LGM_USER_LOGIN' => "a user", 
    'LGM_DATE' => 'CURRENT_TIMESTAMP' 
); 

$db->insert('JOURNAL', $journal); 

이의 단점 :

$id = (int) $db->fetchColumn('SELECT SEQ_JOURNAL.NEXTVAL FROM dual'); 

이 삽입 문에서 검색 ID를 사용하여 두 개의 쿼리를 포함한다는 것입니다.이 중 하나는 준비된 명령문에 따라이 아닌 DBAL의 바로 가기입니다

두 번째 방법 (삽입()는 실제 준비된 문장에 DBAL의 바로 가기입니다, executeUpdate의()) :

$db->executeUpdate(" 
    INSERT INTO JOURNAL (
     LGM_ID, 
     LGM_USER_LOGIN, 
     LGM_DATE 
    ) VALUES (
     SEQ_JOURNAL.NEXTVAL, 
     :userLogin, 
     CURRENT_TIMESTAMP 
    ) 
", array(
    :userLogin => 'a user', 
)); 

제 생각에는 첫 번째 것보다 낫습니다. CURRENT_TIMESTAMP 함수를 사용할 수 있습니다 (첫 번째 유스 케이스에 대해서는 잘 모르겠습니다).

CURRENT_TIMESTAMP를 다르게 처리하려는 경우, 열의 기본값을 현재 날짜로 설정할 수 있습니다.

관련 문제