我需要帮助我试图在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,嵌套表,关联数组这样的东西,但我真的不明白 他们,我不知道他们是否能帮我解决问题。所以请就此提出建议。先感谢您 抱歉很长的解释和糟糕的语法。
答案 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树查找。我使用这种技术和类似的查询对数百万行 - 每天数千次。它很快。
接下来,当网络用户点击链接时,只调用这些上一个/下一个功能。不要再拨打两次来显示下一个和上一个链接。
做这些事应该可以解决这个问题。实际上,在数据库上执行此操作是最佳选择。你可以通过缓存列表员工在中间层解决这个问题......这不是一个好的计划,因为在缓存列表后可以添加或删除员工,列表也可能很大。它已经缓存在数据库中......使用它。回到数据库是确保获得正确员工的可靠方法。
希望这有帮助。