2

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

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

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

结果屏幕 - 将考虑从前一个屏幕传递的参数运行 sql 查询 查询的结果将显示在按例如(姓氏)排序的表中。下面的示例结果

|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、varray、嵌套表、关联数组之类的东西,但我不太了解它们,也不知道它们是否能帮助我解决问题。所以请就此提出建议。在此先感谢您,并对冗长的解释和糟糕的语法感到抱歉。

4

1 回答 1

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。

此外,您需要一个关于姓氏、雇员 ID 的索引。这样做是为了让查询只需要读取索引而不需要引用表。换句话说,确保表的索引方式使得索引包含所有被查询的项目。使用解释计划来查看查询的执行计划。并不断更改索引,直到您看到表本身从未被引用。

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

接下来,只有当网络用户点击链接时才调用这些 Prev/Next 函数。不要调用它两次来显示下一个和上一个链接。

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

希望这可以帮助。

于 2013-08-02T01:34:43.863 回答