从oracle中选择记录

时间:2011-05-07 07:56:51

标签: php sql oracle

要选择最后一条记录,我的数据库是MySQL时使用它:

$result = mysql_query("SELECT Id 
                         FROM test 
                     ORDER BY LENGTH(Id), Id ASC");

$count = mysql_numrows($result);

if($count != 0) {    
  $lastid = mysql_result($result,$count-1,"Id");    
}

......它运作正常。
但现在我的表位于Oracle数据库中 - 我写道:

$stid = oci_parse($conn, "SELECT Id 
                            FROM test 
                        ORDER BY LENGTH(Id), Id ASC");

oci_execute($stid);

$p = oci_parse($conn, "SELECT COUNT(ID) 
                         FROM test");

oci_execute($p);

$count = oci_fetch_array($p);

if($count[0] != 0) {    
  $lastid = oci_result($stid, $count[0]-1);
}

它不起作用 - 我没有得到最后的记录。

2 个答案:

答案 0 :(得分:3)

你还有什么用呢?如果要确定下一个ID,则不要执行此操作,而是使用sequence。如果没有,那么您可以使用select max(id) from testid来获取列的最大值。

修改

首先创建一个序列来存储序号:

create sequence testid_seq;

然后,当您插入记录时,请使用

insert into testid(id, ...) values ("D111-" || testid_seq.nextval, ... );

只需填写要插入信息的点。

答案 1 :(得分:0)

如果您阅读oci_result的文档,则会发现您错误地使用了第二个参数。

第二个参数是用于检索列的参数 - 它可以是列名称或序数值。序数值是一个数字,从一(1)开始,基于SELECT子句中指定的列。普通不是推荐的做法,因为如果查询发生变化 - 如果您忘记更新序数引用,则会隐藏值的检索。实际上,后续COUNT查询返回的值高于第一个查询SELECT子句中的列数。

$stid = oci_parse($conn, "SELECT Id 
                            FROM test 
                        ORDER BY LENGTH(Id), Id ASC");

oci_execute($stid);

$lastid = oci_result($stid, 1);

oci_result缺少mysql_result提供的第三个参数。

要在Oracle中使用,请使用:

$stid = oci_parse($conn, "SELECT x.id
                            FROM (SELECT Id 
                                    FROM test 
                                ORDER BY LENGTH(Id) DESC, Id DESC) x
                           WHERE ROWNUM = 1");

oci_execute($stid);

$lastid = oci_result($stid, 1);

更新的查询将返回一行,最新的一行基于您之前使用的ORDER BY的反转。