2011-08-30 3 views
0

이것이 Perl 또는 Oracle 문제인지 확실하지 않습니다. 나는 둘 다 처음이야.Oracle에서 선택 쿼리 캐싱 중지 - Perl에서 쿼리 실행

테이블에 1 개의 행이 있습니다. 그 값은 숫자입니다. 이 번호는 매우 자주 업데이트됩니다.

이 값을 얻기 위해 Perl에서 select 쿼리를 실행하면 항상 최신 값이되는 것은 아닙니다. 일반적으로 오래된 값입니다. SQLPLUS를 통해 동일한 쿼리를 실행하고 올바른 값을 볼 것입니다 ... Perl은 테이블의 데이터를 삭제하고 다시 삽입하면 올바른 값만 표시합니다.

그래서 궁금합니다.이 쿼리가 어떻게 캐시되고 있습니까?

이 나는 ​​펄에서 쿼리를 실행 해요 방법은 다음과 같습니다

my $sql_latest_jobID = "SELECT /*+ NOCACHE */ job_number FROM example_table WHERE ID = 1"; 

my $sth = $dbh->prepare($sql_latest_jobID) 
      or die "Couldn't prepare statement: " . $dbh->errstr; 


      $sth->execute(); 
      my @data = $sth->fetchrow_array(); 
      $jobID = $data[0]; 

는 또한 NOCACHE없이 쿼리를 시도했다. 같은 결과가있었습니다.

+2

이것은 불가능합니다. 업데이트가 완료되었는지 확인 하시겠습니까? 오라클은 더티 읽기를 허용하지 않으므로 SQL * Plus에서 변경 사항을 커밋하지 않으면 Perl에서 볼 수 없습니다. 각 세션은 독립적입니다. – NullUserException

답변

6

필자는 Perl을 모르지만 데이터를 커밋하지 않은 것으로 보입니다. 따라서 Perl은 업데이트 된 값을 보지 못합니다.

또 다른 가능성은 Perl이 격리 수준을 반복 읽기로 변경하는 것일 수 있습니다. 이 경우 업데이트 된 값을보기 위해 (Perl 내에서) 커밋 또는 롤백을 실행하여 현재 트랜잭션을 Perl로 끝내야합니다 (SELECT조차도 트랜잭션입니다!).

+0

나는 커밋하지 않았다. 이제 작동합니다. 당신의 도움을 주셔서 감사합니다! – mscccc

1

오라클은 이러한 방식으로 결과를 캐시하지 않습니다. 당신은 항상 테이블에 무엇이 있는지를 볼 것입니다 (커밋 된 것).

그래서, 또는 오라클 (perl)에서는 캐시를 일부 사용합니다. 또는 예를 들어 다른 테이블을 쿼리하는 것과 같이 일반적인 오류가 발생했습니다.