0

APEX バージョン: 4.1.1.00.23 例: http://apex.oracle.com/pls/apex/f?p=27554:51 ログイン: デモ pw: デモ

ページにシャトルがあり、アイテムを右パネルから左パネルに移動するときに、データベースのテーブル列「Analyst」を「null」で更新したい

ページが読み込まれると、右側のパネルにアイテムが表示される場合と表示されない場合があります。

ここに画像の説明を入力

DB table (when page loads):
Field                          Analyst
Co-Borrower Credit Score       Analyst_1
Appraised Value                Analyst_1
Appraisal Identifier           Analyst_1

次に、一部またはすべてのアイテムを右パネルから左パネルに移動し、[変更を適用] をクリックした後、左パネルのフィールド名ごとに DB のアナリスト フィールドに「null」を入れたいと思います。

ここに画像の説明を入力

DB table (after clicking button):
Field                          Analyst
Co-Borrower Credit Score       Analyst_1
Appraised Value                (null)
Appraisal Identifier           (null)

これが私の現在のページプロセスです(送信後):

declare
    tab apex_application_global.vc_arr2;
    l_count number;
begin
    tab := apex_util.string_to_table (:P51_SHUTTLE);
    for i in 1..tab.count 
    loop
    select count(*) into l_count from DQ_MANUAL_EDIT WHERE DQ_ATTRIBUTE = tab(i);
     if l_count > 0 then 
       UPDATE DQ_MANUAL_EDIT
       SET DQ_ANALYST = :P51_DQ_ANALYST
       WHERE DQ_ATTRIBUTE = tab(i);
    end if;
    end loop;
end;

前もって感謝します!!

4

2 に答える 2

1

シャトルの左側にはアクセスできません。右側には、送信される値があります。したがって、データベースの値と送信された値の間の変更を把握することによってのみ、これらのレコードを変更できます。
可能であれば、まず関連するすべてのレコードを削除してから、新しい値を挿入してください。

declare
    tab apex_application_global.vc_arr2;
    l_count number;
begin
    DELETE FROM DQ_MANUAL_EDIT
    WHERE DQ_ANALYST = :P51_DQ_ANALYST;

    tab := apex_util.string_to_table (:P51_SHUTTLE);
    for i in 1..tab.count 
    loop
    select count(*) into l_count from DQ_MANUAL_EDIT WHERE DQ_ATTRIBUTE = tab(i);
     if l_count > 0 then 
       INSERT INTO DQ_MANUAL_EDIT (DQ_ANALYST, DQ_ATTRIBUTE)
       VALUES (:P51_DQ_ANALYST, tab(i));
    end if;
    end loop;
end;

レコードを削除して保持するのではなくNULL値を保持する場合は、最初にレコードを次のように更新できます。NULL

declare
    tab apex_application_global.vc_arr2;
    l_count number;
begin
    UPDATE DQ_MANUAL_EDIT
    SET DQ_ANALYST = NULL
    WHERE DQ_ANALYST = :P51_DQ_ANALYST;

    tab := apex_util.string_to_table (:P51_SHUTTLE);
    for i in 1..tab.count 
    loop
    select count(*) into l_count from DQ_MANUAL_EDIT WHERE DQ_ATTRIBUTE = tab(i);
     if l_count > 0 then 
              UPDATE DQ_MANUAL_EDIT
              SET DQ_ANALYST = :P51_DQ_ANALYST
              WHERE DQ_ATTRIBUTE = tab(i);
    end if;
    end loop;
end;

ループ構造を使用する場合、これが最も簡単な方法です。

于 2012-11-26T09:04:29.217 に答える
0

ループの代わりに、次の 2 つの更新を行うことができます。

UPDATE DQ_MANUAL_EDIT
   SET DQ_ANALYST = :P51_DQ_ANALYST
   WHERE DQ_ATTRIBUTE in (select * from tab);

UPDATE DQ_MANUAL_EDIT
   SET DQ_ANALYST = NULL
   WHERE DQ_ATTRIBUTE not in (select * from tab);

単純すぎると思いますか?

于 2012-11-22T12:17:34.470 に答える