2011-02-24 6 views
1

ODBC functions을 통해 Oracle 9i 데이터베이스를 사용하는 PHP로 작성된 레거시 애플리케이션에 새로운 기능을 추가하고 있습니다. 자동 증분 ID를 생성하는 시퀀스 및 트리거가있는 테이블을 만들었습니다.ODBC를 통해 자동 증가 ID 검색

  • 는 ODBC 라이브러리 전용 lastInsertId 방법이 표시되지 않습니다

    지금, 내가 삽입을하고 이후에 생성 된 ID를 얻을 수있는 방법을 찾기 위해 사투를 벌인거야.
  • RETURNING 절을 사용하여 쿼리를 실행하면 ORA-00439: feature not enabled: RETURNING clause from this client type이 트리거됩니다.
  • BEGIN...END 블록에 동봉하면 RETURNING 절을 실행할 수 있지만 조금 도움이됩니다 : OUT parameters are apparently not supported by the Unified ODBC driver PHP uses.

나머지 트랜잭션에서 시퀀스 이름을 하드 코드하여 SEQ_NAME.CURRVAL을 사용해야합니까? 동시 액세스가 있어도 적절한 가치를 얻으려면 어떻게해야합니까?

업데이트 :

+1

오라클 또는 Microsoft의 OLE DB 구현 중 어느 것을 사용하고 있습니까? – APC

+0

@APC - Oracle 용 Microsoft ODBC 드라이버. 내가 아는 한 OLE가 아닙니다 (제 자신이 관리하지 않는 타사 서버입니다). –

+0

안녕하세요 알바로 - 응답을 입력하는 동안 질문을 변경했습니다. 8-) MSDAORA를 사용하고 있습니까? – APC

답변

3

가장 좋은 방법은 당신이 사용하는 ID를 반환 할 데이터베이스 측의 PL/SQL의 API 등이 삽입을 코딩 할 수 있습니다 실패한 시도한다에 세 번째 점을 추가했다. 예)

create function insert_yourtable(p_f1 number, p_f2 varchar2, ... p_fn varchar2) 
return number 
    idval number; 
begin 
    insert into yourtable(f1, f2,...fn) 
    values (p_f1, p_f2, ...p_fn) 
    returning your_id_value into idval; 
    return idval; 
end; 
/

그런 다음 당신은 아웃 PARAM을 얻고 트랜잭션의 나머지 부분에 대한 ID를 사용하는 준비된 문장으로이 호출 할 수 있습니다.

으악이 - 다만 "아니 OUT PARAMS 코멘트 ..."

확인을보고, 나는 당신이 UI에서 모든 것을 관리 할 필요가 같아요. 테이블에서 트리거를 삭제 , 마십시오

select yourseq.nextval from dual; 

로컬로 저장 한 다음 사용 가능한 키 값을 얻을, 다음 테이블의 ID 필드에 삽입 할 검색 ID를 사용하여 작업 자신의 모든 것을 할 수 있습니다 . 순서에 따라 ID에 트랜잭션 보안이 설정됩니다.

ODBC의 엉덩이 구현에는 어떤 어려움이 있습니다!

+0

믿거 나 말거나, 나는 삽입하기 전에'.NEXTVAL'을 호출하고 ID를 직접 설정하는 명백한 가능성을 간과했다. 믿을 만하고 단순 해 보입니다. * (그리고 네, ODBC를 싫어하는 것을 배웠습니다.) * –

+0

네, NEXTVAL을 가져 오는 것에 대한 유일한 귀찮은 일은 불필요한 데이터베이스로의 추가 왕복입니다. –