0

私は2つのテーブルを持っています:-人と銀行の詳細

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;
4

2 に答える 2

1

あなたのコードはエラーだらけなので、スタックオーバーフローの投稿のためにこのすべてを急いでまとめたかどうかを知るのは難しいです。C1主な問題は、ループの各反復で3つのローカル変数をNULLにリセットしていないことです。

また、「銀行のフォームが「Reimb」なしで「Sal」のみの場合、印刷する必要のあるテーブル」は、両方が存在する場合にコードが印刷されるという点で、コードと一致しません。

これらすべてのカーソルループを必要とせずに、このすべてを単一のSQLステートメントで実行できます。

于 2013-02-14T17:16:38.167 に答える
0

ここで重要なのは、SQLを使用して、アクションを実行するレコードを分離することです。

1つの形式は次のとおりです。

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にロジックをプッシュすることです(特に明示的なもの)。

コメント*:「exists」サブクエリでは、サブクエリから投影された値は重要ではありません。「exists」は、含まれている列または行の数と値に関係なく、行が投影されているかどうかを確認しようとしています。null、1、 "x"、またはその他のリテラルのいずれかを選択することは同等ですが、nullを選択することは、「値が何であるかは関係ありません」と言う良い方法です。

于 2013-02-14T17:07:25.350 に答える