2016-12-14 10 views
1

私はwhere句の3つの異なるテーブルに対して同じ変数(:Item)を使用するこのSQLを持っています。 Oracle SQL開発者はうまく動作します。ポップアップしてItemを要求し、正しいデータを返します。
このSQLを使用してユーザーがアイテムを参照できるようにするWebページを作成したいとします。これは、Oracleデータベースに対して照会しています。 これを書き直す方法はありますか?3:Itemsを1に結合しますか?
それから私はそれをウェブページの検索フィールドとして使用します。
私はこれに親切で親切です。Webページの参照のためのバインド変数の結合

SELECT ITEM_C.SEGMENT1 "Chain (Top) Item", 
    ITEM_C.DESCRIPTION, 
    ITEM_F.SEGMENT1 "Newer Item", 
    ITEM_F.DESCRIPTION, 
    item_t.SEGMENT1 "Older Item", 
    item_t.DESCRIPTION "Older Description", 
    ITEM_C.ITEM_TYPE TOP_ITEM_TYPE, 
    ITEM_F.ITEM_TYPE NEWER_ITEM_TYPE, 
    item_t.ITEM_TYPE Older_Item_Type, 
    DOF.LINK_NUMBER, 
    DOF.SUPERCESSION_TYPE, 
    (SELECT fu.USER_NAME 
    FROM apps.fnd_user fu 
    WHERE fu.USER_ID = DOF.CREATED_BY 
) "DOF Created By", 
    DOF.CREATION_DATE "DOF Created", 
    DOF.LAST_UPDATE_DATE "DOF Updated", 
    item_t.CREATION_DATE "Older Created", 
    item_t.LAST_UPDATE_DATE "Older Updated", 
    ITEM_C.CREATION_DATE "Top Created", 
    TRUNC(ITEM_C.CREATION_DATE - DOF.CREATION_DATE, 1) "Chain Lag", 
    DECODE(
    (SELECT 1 FROM inv.mtl_system_items_b a WHERE a.INVENTORY_ITEM_ID = ITEM_C.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 2470383 
), NULL, 'No', 'Yes') "Top in P01", 
    DECODE(
    (SELECT 1 FROM INV.MTL_SYSTEM_ITEMS_B a WHERE a.INVENTORY_ITEM_ID = ITEM_C.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 98 
), NULL, 'No', 'Yes') "Top in FTE", 
    DECODE(
    (SELECT 1 FROM inv.mtl_system_items_b a WHERE a.INVENTORY_ITEM_ID = ITEM_F.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 2470383 
), NULL, 'No', 'Yes') "Newest in P01", 
    DECODE(
    (SELECT 1 FROM INV.MTL_SYSTEM_ITEMS_B a WHERE a.INVENTORY_ITEM_ID = ITEM_F.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 98 
), NULL, 'No', 'Yes') "Newest in FTE", 
    DECODE(
    (SELECT 1 FROM inv.mtl_system_items_b a WHERE a.INVENTORY_ITEM_ID = item_t.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 2470383 
), NULL, 'No', 'Yes') "Oldest in P01", 
    DECODE(
    (SELECT 1 FROM inv.mtl_system_items_b a WHERE a.INVENTORY_ITEM_ID = item_t.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 98 
), NULL, 'No', 'Yes') "Oldest in FTE", 
    ITEM_C.PURCHASING_ENABLED_FLAG "Top Purchasing Enabled", 
    ITEM_F.PURCHASING_ENABLED_FLAG "Newer Purchasing Enabled", 
    item_t.PURCHASING_ENABLED_FLAG "Older Purchasing Enabled", 
    ITEM_C.FIXED_LOT_MULTIPLIER CHAIN_FLM, 
    ITEM_F.FIXED_LOT_MULTIPLIER NEWER_FLM, 
    item_t.FIXED_LOT_MULTIPLIER Older_FLM, 
    SysDate "Current Date" 
FROM IKNDOF.IKN_DOF_ITEM_CHAINS DOF 
LEFT OUTER JOIN INV.MTL_SYSTEM_ITEMS_B ITEM_F 
ON DOF.FROM_ITEM_ID = ITEM_F.INVENTORY_ITEM_ID 
AND ITEM_F.ORGANIZATION_ID = 86 
LEFT OUTER JOIN INV.MTL_SYSTEM_ITEMS_B ITEM_C 
ON DOF.CHAIN_ITEM_ID = ITEM_C.INVENTORY_ITEM_ID 
AND ITEM_C.ORGANIZATION_ID = 86 
LEFT OUTER JOIN inv.mtl_system_items_b item_t 
ON DOF.TO_ITEM_ID = item_t.INVENTORY_ITEM_ID 
AND item_t.ORGANIZATION_ID = 86 
WHERE 1 = 1 
AND DOF.CHAIN_ITEM_ID  IN 
    (SELECT DISTINCT df.CHAIN_ITEM_ID 
    FROM inv.mtl_system_items_b topi, 
    inv.mtl_system_items_b fri, 
    inv.mtl_system_items_b toi, 
    ikndof.ikn_dof_item_chains df 
    WHERE df.FROM_ITEM_ID = fri.INVENTORY_ITEM_ID(+) 
    AND df.TO_ITEM_ID  = toi.INVENTORY_ITEM_ID(+) 
    AND df.CHAIN_ITEM_ID  = topi.INVENTORY_ITEM_ID(+) 
    AND fri.ORGANIZATION_ID = 86 
    AND toi.ORGANIZATION_ID = 86 
    AND topi.ORGANIZATION_ID = 86 
    AND (fri.SEGMENT1 LIKE :Item 
    OR toi.SEGMENT1 LIKE :Item 
    OR topi.SEGMENT1 LIKE :Item) 
) 
ORDER BY "Chain (Top) Item", 
    DOF.LINK_NUMBER 

おかげで、スコット

答えて

0

あなたはここに2つのオプションがある -

オプション1は、使用するスクリプト言語に応じた構文を使用してWebページにこのクエリを置きます。このオプションはお勧めしません。

オプション2. Oracleでストアドプロシージャ(SP)を作成し、Webページで呼び出します。

。)SPがコンパイルされるので、これははるかに優れた選択肢であるので、より速く

Bを実行します。)これは、複数のページ/クライアントによって再使用することができます。

c)クエリが変更された場合は、SPを1つの場所(SP)に変更するだけです。

私はあなたのためにまとめたストアドプロシージャを以下に示します。IDEでコンパイルしてください。

CREATE OR REPLACE PROCEDURE yourdb.yourproc 
(
     i_search   IN varchar2, 
     o_return_cursor  OUT GLOBAL.GenericCursorType 
) AS 
BEGIN 


    OPEN o_return_cursor FOR 
SELECT ITEM_C.SEGMENT1 "Chain (Top) Item", 
    ITEM_C.DESCRIPTION, 
    ITEM_F.SEGMENT1 "Newer Item", 
    ITEM_F.DESCRIPTION, 
    item_t.SEGMENT1 "Older Item", 
    item_t.DESCRIPTION "Older Description", 
    ITEM_C.ITEM_TYPE TOP_ITEM_TYPE, 
    ITEM_F.ITEM_TYPE NEWER_ITEM_TYPE, 
    item_t.ITEM_TYPE Older_Item_Type, 
    DOF.LINK_NUMBER, 
    DOF.SUPERCESSION_TYPE, 
    (SELECT fu.USER_NAME 
    FROM apps.fnd_user fu 
    WHERE fu.USER_ID = DOF.CREATED_BY 
) "DOF Created By", 
    DOF.CREATION_DATE "DOF Created", 
    DOF.LAST_UPDATE_DATE "DOF Updated", 
    item_t.CREATION_DATE "Older Created", 
    item_t.LAST_UPDATE_DATE "Older Updated", 
    ITEM_C.CREATION_DATE "Top Created", 
    TRUNC(ITEM_C.CREATION_DATE - DOF.CREATION_DATE, 1) "Chain Lag", 
    DECODE(
    (SELECT 1 FROM inv.mtl_system_items_b a WHERE a.INVENTORY_ITEM_ID = ITEM_C.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 2470383 
), NULL, 'No', 'Yes') "Top in P01", 
    DECODE(
    (SELECT 1 FROM INV.MTL_SYSTEM_ITEMS_B a WHERE a.INVENTORY_ITEM_ID = ITEM_C.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 98 
), NULL, 'No', 'Yes') "Top in FTE", 
    DECODE(
    (SELECT 1 FROM inv.mtl_system_items_b a WHERE a.INVENTORY_ITEM_ID = ITEM_F.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 2470383 
), NULL, 'No', 'Yes') "Newest in P01", 
    DECODE(
    (SELECT 1 FROM INV.MTL_SYSTEM_ITEMS_B a WHERE a.INVENTORY_ITEM_ID = ITEM_F.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 98 
), NULL, 'No', 'Yes') "Newest in FTE", 
    DECODE(
    (SELECT 1 FROM inv.mtl_system_items_b a WHERE a.INVENTORY_ITEM_ID = item_t.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 2470383 
), NULL, 'No', 'Yes') "Oldest in P01", 
    DECODE(
    (SELECT 1 FROM inv.mtl_system_items_b a WHERE a.INVENTORY_ITEM_ID = item_t.INVENTORY_ITEM_ID 
    AND a.ORGANIZATION_ID = 98 
), NULL, 'No', 'Yes') "Oldest in FTE", 
    ITEM_C.PURCHASING_ENABLED_FLAG "Top Purchasing Enabled", 
    ITEM_F.PURCHASING_ENABLED_FLAG "Newer Purchasing Enabled", 
    item_t.PURCHASING_ENABLED_FLAG "Older Purchasing Enabled", 
    ITEM_C.FIXED_LOT_MULTIPLIER CHAIN_FLM, 
    ITEM_F.FIXED_LOT_MULTIPLIER NEWER_FLM, 
    item_t.FIXED_LOT_MULTIPLIER Older_FLM, 
    SysDate "Current Date" 
FROM IKNDOF.IKN_DOF_ITEM_CHAINS DOF 
LEFT OUTER JOIN INV.MTL_SYSTEM_ITEMS_B ITEM_F 
ON DOF.FROM_ITEM_ID = ITEM_F.INVENTORY_ITEM_ID 
AND ITEM_F.ORGANIZATION_ID = 86 
LEFT OUTER JOIN INV.MTL_SYSTEM_ITEMS_B ITEM_C 
ON DOF.CHAIN_ITEM_ID = ITEM_C.INVENTORY_ITEM_ID 
AND ITEM_C.ORGANIZATION_ID = 86 
LEFT OUTER JOIN inv.mtl_system_items_b item_t 
ON DOF.TO_ITEM_ID = item_t.INVENTORY_ITEM_ID 
AND item_t.ORGANIZATION_ID = 86 
WHERE 1 = 1 
AND DOF.CHAIN_ITEM_ID  IN 
    (SELECT DISTINCT df.CHAIN_ITEM_ID 
    FROM inv.mtl_system_items_b topi, 
    inv.mtl_system_items_b fri, 
    inv.mtl_system_items_b toi, 
    ikndof.ikn_dof_item_chains df 
    WHERE df.FROM_ITEM_ID = fri.INVENTORY_ITEM_ID(+) 
    AND df.TO_ITEM_ID  = toi.INVENTORY_ITEM_ID(+) 
    AND df.CHAIN_ITEM_ID  = topi.INVENTORY_ITEM_ID(+) 
    AND fri.ORGANIZATION_ID = 86 
    AND toi.ORGANIZATION_ID = 86 
    AND topi.ORGANIZATION_ID = 86 
    AND (fri.SEGMENT1 LIKE i_search 
    OR toi.SEGMENT1 LIKE i_search 
    OR topi.SEGMENT1 LIKE i_search) 
) 
ORDER BY "Chain (Top) Item", 
    DOF.LINK_NUMBER ; 


EXCEPTION 
    WHEN OTHERS THEN 

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQLCODE)||' yourproc WHEN OTHERS '); 
END; -- Procedure 
/
+0

ありがとうございましたLeonidさん、私はストアドプロシージャを作成する権利がありません。私は管理者に私のためにそれを行い、それをテストさせることができるかどうかを見ます。 – ready4data

関連する問題