【问题标题】:selecting record from oracle从 oracle 中选择记录
【发布时间】:2011-08-20 15:51:45
【问题描述】:

要选择最后一条记录,当我的数据库是 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);
}

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

【问题讨论】:

  • 最后一条记录怎么定义?是最后插入的吗?为什么你需要得到它?
  • 当表中没有任何内容时,我想插入 D1111,然后如果我得到 D1111,我将插入 D1112,然后 ....9,10,11。使用 mysql 的代码(上部)它很好。但问题是当数据库转移到oracle(我的代码的第二部分)时。实际上我曾经向你展示前缀

标签: php sql oracle


【解决方案1】:

你用这个做什么?如果要确定下一个Id,那么不要这样做,而是使用sequence。如果没有,那么您可以使用select max(id) from testid 来获取该列的最大值。

编辑

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

create sequence testid_seq;

那么当你插入一条记录时,使用

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

只需在圆点处填写您要插入的信息。

【讨论】:

  • 列不是数字类型。它的第一个字符是 D。我需要序列 D111-1 D111-2 D111-3.max(id) 将不起作用
  • 您应该在问题中提及这一点。
  • 但是你在插入新记录的时候是用它来确定下一个id吗?如果是这样,您仍然可以使用仅存储 ID 的最后一个数字的序列,然后在 ID 列中插入以 D111- 为前缀的值。
  • 我刚刚编辑了我的答案以更详细地说明它,这种方法应该可以工作(虽然我上次使用 Oracle 已经有一段时间了:p)。
  • 虽然我同意有更好的设置方法,但像这样的更改并非微不足道。我们说“改变你的数据模型”很容易,但我们不必做这项工作——考虑到人们提出这些问题可能会处理 100+K 条记录,这是非常不合理的。
【解决方案2】:

如果您阅读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

【讨论】:

  • @Rasel:在您拥有的任何客户端(SQLPlus、Toad、PLSQLDeveloper)中直接针对 Oracle 运行 SQL 查询。第二个例子只会返回一个值...
  • 哦,您的查询只是颠倒了我的查询。所以我现在需要的是第一行。我将接受您的回答。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多