2011-08-30 45 views
0

不确定这是Perl还是Oracle问题。我对这两个都很陌生。从缓存中停止Oracle选择查询 - 从Perl运行查询

我表中有1行。它的值是一个数字。此号码经常更新。

当我运行从Perl的select查询得到这个值......它并不总是最新的值。它通常是一个旧的价值。我将通过SQLPLUS运行相同的查询,然后我会看到正确的值...如果我删除表中的数据并再次插入,Perl将只显示正确的值。

所以,我想知道 - 这是查询以某种方式被缓存?

这就是我如何运行在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

这是不可能的。你确定你更新过吗? Oracle不允许脏读,所以如果您没有在SQL * Plus中提交更改,您将无法在Perl中看到它们 - 请注意,每个会话都是独立的。 – NullUserException

回答

6

我不知道Perl的,但似乎你是不是在提交数据,因此Perl不会看到更新后的值。

另一种可能是Perl改变隔离级别设置为可重复读。如果是这样的话,您需要通过发出提交或回滚(从Perl内部)来结束当前的Perl事务(即使是一个事务!)以查看更新的值。

+0

我没有犯。现在工作。谢谢你的帮助! – mscccc

1

Oracle不会以这种方式缓存结果。你总是会看到表中的内容(提交的内容)。

所以,还是 甲骨文(Perl中)在你使用一些缓存。 或 你做出一个平庸的错误,例如查询另一个表:)