【问题标题】:Loop not working in package循环在包中不起作用
【发布时间】:2013-02-14 16:59:40
【问题描述】:

我有两张表:- 个人和银行详细信息

Person table :---
person_id     employee_number
393829          X1029
648494          x9494
393939          X2299

Bank details :---

person_id       bank_form
393829         Reimb
393829         Sal
648494         Sal
393939         Common

现在,如果某个人的银行表格为“sal”和“reimb”,则必须打印“This is it”。如果他只有“common”作为银行表格,则也无需执行任何操作。 我为此做了一个光标。但是“这就是它”行不起作用。

Create or replace package body xx_bank_details
as 
procedure xx_bank_details_proc( 
ERRBUF out varchar2,
 RETCODE  out varchar2
)

Cursor c1
is 
select person_id
from person;

Cursor c2(p_person_id)
is select bank_form
from bank_details
where bank_details.person_id=p_person_id;

begin

for cur_c1 in c1
loop
        for cur_c2 in c2(c1.person_id)
        loop
        if(cur_c2.bank_details='Sal')
then
l_sal :='Sal';
end if;
if(cur_c2.bank_details='Reimb')
then
l_reimb :='Reimb';
end if;
if(cur_c2.bank_details='Common')
then
l_common :='Common';
end if;
end loop;
if (l_sal is not null and l_reimb is not null)
then
fnd_output.put_line("This is it !");
end if;

end loop;
end xx_bank_details_proc;
end xx_bank_details;

【问题讨论】:

  • 一团糟... p_person_id 是什么?如果您希望获得帮助,请构建示例表和数据。
  • p_person_id 正在下面使用。请检查
  • 您的 p_person_id 应该在程序 xx_bank_details_proc 中声明。否则你应该得到一个错误。

标签: sql oracle11g oracle-sqldeveloper plsqldeveloper


【解决方案1】:

您的代码充满了错误,因此很难知道您是否匆忙将整个事情放在一起以用于 stackoverflow 发布或什么。您的主要问题是您没有在 C1 循环的每次迭代中将三个局部变量重置为 NULL。

您的逻辑也如所述“但如果银行表格只有“Sal”而没有“Reimb”,那么您必须打印出来的表格”与代码不匹配,因为如果两者都存在,则代码正在打印出来.

这整个事情可以在单个 SQL 语句中完成,尽管不需要所有这些游标循环。

【讨论】:

  • 但是我的第一个循环不工作.. 那是我有一个人同时有sal 和reimb.. 'This is it' 应该被打印出来.. 没有发生。至于代码......我只需要逻辑......我已经再次编写了整个代码,因为我无法在这里编写确切的代码
  • 停止使用 PL/SQL 循环,只需使用 SQL 找到您想要的数据
  • @user2065695 - 您不需要编写代码。您需要构建示例表,用示例数据填充它们并清楚地描述逻辑。正如 Dazzal 所写,您不需要所有这些循环......
  • 这些表中提供了近 100 个值。所以我认为 Cursor 会是一个更好的选择。但是,是的,我是甲骨文的新手。将尝试提高我的编码技能
【解决方案2】:

这里的关键是使用 SQL 来隔离您要对其执行操作的记录。

一种形式是:

begin
for x in (
  select person_id
  from   person
  where  exists (
           select null -- see comment below *
           from   bank_details
           where  bank_details.person_id=person.person_id and
                  bank_form in ('Sal','Reimb')
           having count(*) = 2)
loop
  fnd_output("This is it!)
end loop
end

可以使用的 SQL 有很多变体,但关键问题是将逻辑推送到 SQL 而不是游标中,尤其是显式的。

comment * :在“存在”子查询中,从子查询投影的值无关紧要。 “存在”正在查看是否投影了任何行,无论包含多少列或行以及值是什么。选择 null、1、“x”或任何其他文字中的任何一个都是等效的,但选择 null 是一种很好的表达方式,即“值是什么并不重要”。

【讨论】:

  • 我没有理解逻辑。请解释一下帽子会选择空做。
  • 我希望如果一个人 (person_id=393829 ) 的 bank_form 为 'Sal' 和 'Reimb' 则应该打印“This is It”
  • 这听起来与“但如果银行表格只有“Sal”而没有“Reimb”,那么您必须将表格打印出来。”对我来说,但你要找的是如果一个人有“Sal”和“Reimb”的表格而没有其他人的表格,他们会被打印出来吗?或者,如果有“Sal”和“Reimb”以及其他任何形式的表格?
  • 如果一个人的 bank_details 既是“Reimb”又是“Sal”,那么必须打印“This is It”。循环错了吗?
  • 现在,如果bank_details 表中同时存在Sal 和Reimb 记录,则无论是否有其他记录,查询都会返回人员ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多