PL / SQL创建有效的记录导航

时间:2013-07-18 22:10:47

标签: oracle plsql

我需要帮助我试图在PL / SQL中开发的应用程序

基本上我的应用程序有3个屏幕。 '参数屏幕','结果屏幕'和'详细信息屏幕'

参数屏幕 - 用户将从表单中的下拉框中选择一些参数。然后他们会点击 提交按钮,将在下一个屏幕(结果屏幕)上传递

结果屏幕 - 将运行sql查询,同时考虑从上一个屏幕传递的参数 查询结果将显示在一个表中,例如(Surname)。下面的示例结果

|ID|EmployeeID|Surname|Date of Birth|
 1  1234       Adam    11-14-1995
 2  5678       Reyes   06-03-1993
 3  9876       Olivers 03-02-1992

下一个屏幕(详细信息屏幕)将显示有关该员工的更多详细信息。结果之间的过渡 单击结果屏幕中employee_surname的href链接

,将显示屏幕和详细信息屏幕

所以在上面的结果表中,姓氏'Reyes'是可点击的Reyes

点击结果中的姓氏后,会调用程序details_screen(如上面链接所示)并处理 参数'id'和'emid'在该过程中运行查询并再次显示有关该参数的更多信息 特定员工。详细信息屏幕看起来像这样

ID: 2
EmployeeID: 5678
Surname: Reyes
First Name: Alan
Date of Birth: 06-03-1993
Hobbies: Basketball

我设法完成从参数到详细信息屏幕的所有屏幕。但是,我想要一些记录导航 在“详细信息屏幕”中,他们无需返回“结果屏幕”即可查看员工的所有记录。 我希望他们在“详细信息屏幕”中进行上一个和下一个导航,例如以下

ID: 2
EmployeeID: 5678
Surname: Reyes
First Name: Alan
Date of Birth: 06-03-1993
Hobbies: Basketball

<a href="details_screen?id=1&emid=1234">Previous</a> | <a href="details_screen?id=3&emid=9876">Next</a>

这就是我被困的地方。我不知道如何实现这一点。 例。我设法实现了这个的脏解决方案,但它需要运行相同的查询 每次在记录集中前进或后退时,在结果屏幕内。 我的查询比我在这里显示的要复杂得多,并且使用我的脏方法在性能方面的代价很高。

如果不反复运行查询,是否有更有效的方法? 类似于查询一次并使用结果呈现导航,同时用户仍在“详细信息屏幕”中导航 然后可能只在用户从头开始时再次查询(参数屏幕)

昨天我只学习了PL / SQL的基础,我仍然是一个菜鸟。我听说过像ref_cursor,varrays,嵌套表,关联数组这样的东西,但我真的不明白 他们,我不知道他们是否能帮我解决问题。所以请就此提出建议。先感谢您 抱歉很长的解释和糟糕的语法。

1 个答案:

答案 0 :(得分:1)

这个问题是可以解决的,pl / sql是解决它的好地方!!!

在详细记录中,您需要下一个和上一个链接。

以下是如何操作:

1.  Write 2 pl/sql functions, Previous and Next. 
2.  Each function should take the id the current emp and return a single id'
3.  Then you'll want a variation of:
   a. the pagination query 
 or 
   b. Oracle's lead/lag function

分页查询最好由Tom描述: http://www.oracle.com/technetwork/issue-archive/2007/07-jan/o17asktom-093877.html

select * 
  from 
( select rownum rnum, a.*
    from (your_query) a
   where rownum <= :M )
where rnum >= :N;

可在此处找到超前/滞后查询: http://www.oracle-base.com/articles/misc/lag-lead-analytic-functions.php

就个人而言,我会使用超前/滞后查询。

要使其执行,您需要确保该函数仅返回上一个/下一个员工的员工ID。

此外,您需要姓氏,employee_id的索引。这样做,以便查询只需要读取索引,永远不需要引用表。换句话说,请确保以索引包含要查询的所有项目的方式对表进行索引。使用说明计划来查看查询的执行计划。并继续更改索引,直到您看到表本身从未被引用。

这有效地将查询转换为超快的b树查找。我使用这种技术和类似的查询对数百万行 - 每天数千次。它很快。

接下来,当网络用户点击链接时,只调用这些上一个/下一个功能。不要再拨打两次来显示下一个和上一个链接。

做这些事应该可以解决这个问题。实际上,在数据库上执行此操作是最佳选择。你可以通过缓存列表员工在中间层解决这个问题......这不是一个好的计划,因为在缓存列表后可以添加或删除员工,列表也可能很大。它已经缓存在数据库中......使用它。回到数据库是确保获得正确员工的可靠方法。

希望这有帮助。