0

私の手に負えない何らかの理由で、過去12か月間のデータを単純に取得しようとしています。ただし、本質的にデータのサイズまで、毎日一時テーブルにクエリを実行し、そこから移動する必要があります。現在、私は DB2 でスクリプトを作成する初心者ですが、SQL 全般については初心者なので、以下のコードを試してみました (ロジックは問題ないように思えます)。

最初は、生成されるレコードの数だけに関心がありましたが、理想的には 2 番目の SELECT コードを実行したいと考えていました。私は Data Studio を使用してきましたが、これを CLP 経由で実行するために必要なデータをエクスポートすると思います。今、私の問題は、構文内に理解できない何かが欠けていて、それが頭を悩ませていることです。それはおそらく非常に基本的なものであるか、完全に間違っているだけです。

SELECT COUNT(*) コードを試してみると、次のエラーが表示されます: - この行に複数のマーカーがあります - DB2 for Linux, UNIX, and Windows: "" was expected after "FROM". - DB2 for Linux、UNIX、および Windows: "." 無効です。

他の SELECT コードを試してみると、次のエラーが表示されます。 .. DB2 for Linux, UNIX, and Windows: 「,」が「FROM」の後に必要でした. DB2 for Linux, UNIX, and Windows: 「,」が「GROUP」の後に必要でした

私はそれを理解していません。誰か助けてくれませんか?SESSION.l12_Dest テーブルも、後でテーブルを手動で調べてみても利用できないようです。

コード: -

--<ScriptOptions statementTerminator="@"/>

CREATE OR REPLACE PROCEDURE HWW.DM_CHECKLIST()
    LANGUAGE SQL
BEGIN
DECLARE GLOBAL TEMPORARY TABLE SESSION.L12_DEST 
(
    ACTUAL_DATE DATE, 
    MARKET_ID INTEGER,
    SUPER_REGION VARCHAR (100), 
    REGION VARCHAR (100), 
    MARKET VARCHAR (100),
    POSA VARCHAR (100),
    DEST_ID INTEGER,
    DEST_NAME VARCHAR (100),
    DEST_TYPE VARCHAR (30),
    STATUS_CODE SMALLINT,
    VISITORS INTEGER
)
ON COMMIT PRESERVE ROWS NOT LOGGED;
COMMIT;

FOR V_ROW AS 
    SELECT ACTUAL_DATE
    FROM DM.DATE_DIM
    WHERE ACTUAL_DATE 
        BETWEEN (CURRENT_DATE - 12 MONTHS) - DAY((CURRENT_DATE - 12 MONTHS)) DAYS + 1 DAYS 
            AND LAST_DAY((CURRENT_DATE - 1 MONTHS))
    DO           
        INSERT INTO SESSION.L12_DEST
        SELECT  B.ACTUAL_DATE,
                Z.HCOM_SRCH_DEST_PROPERTY_MKT_ID,
                Z.HCOM_SRCH_DEST_PROPERTY_MKT_SUPER_REGN_NAME,
                Z.HCOM_SRCH_DEST_PROPERTY_MKT_REGN_NAME,
                Z.HCOM_SRCH_DEST_PROPERTY_MKT_NAME,
                S.SITE_CNTRY_NAME,
                Z.HCOM_SRCH_DEST_ID,
                Z.HCOM_SRCH_DEST_NAME,
                Z.HCOM_SRCH_DEST_TYP_NAME,
                LZ.STATUS_CODE,
                COUNT(DISTINCT(F.VISITOR_KEY))AS VISITORS
        FROM DM.LODG_DEMAND_FACT F
        INNER JOIN DM.V_HCOM_SRCH_DEST_DIM Z 
            ON F.HCOM_SRCH_DEST_KEY = Z.HCOM_SRCH_DEST_KEY
        INNER JOIN DM.DATE_DIM B
            ON F.LOCAL_DEMAND_DATE_KEY = B.DATE_KEY
        INNER JOIN DM.SITE_DIM S
            ON S.SITE_KEY = F.SITE_KEY
        LEFT JOIN LZ.LZ_HCM_DESTINATION LZ
            ON Z.HCOM_SRCH_DEST_ID = LZ.DESTINATION_INT_ID
        WHERE F.BRAND_KEY = 101
            AND B.ACTUAL_DATE = V_ROW.ACTUAL_DATE
        GROUP BY    B.ACTUAL_DATE,
                    Z.HCOM_SRCH_DEST_PROPERTY_MKT_ID,
                    Z.HCOM_SRCH_DEST_PROPERTY_MKT_SUPER_REGN_NAME,
                    Z.HCOM_SRCH_DEST_PROPERTY_MKT_REGN_NAME,
                    Z.HCOM_SRCH_DEST_PROPERTY_MKT_NAME,
                    S.SITE_CNTRY_NAME,
                    Z.HCOM_SRCH_DEST_ID,
                    Z.HCOM_SRCH_DEST_NAME,
                    Z.HCOM_SRCH_DEST_TYP_NAME,
                    LZ.STATUS_CODE;
END FOR;

--SELECT COUNT(*) FROM SESSION.L12_DEST;

--EXPORT TO C:\TEMP\MARKETS.TXT OF DEL 
SELECT  MARKET_ID,
        SUPER_REGION,
        REGION,
        MARKET,
        POSA,
        DEST_ID,
        DEST_NAME,
        DEST_TYPE,
        STATUS_CODE,
        SUM(VISITORS)
FROM SESSION.L12_DEST 
GROUP BY    MARKET_ID,
            SUPER_REGION,
            REGION,
            MARKET,
            POSA,
            DEST_ID,
            DEST_NAME,
            DEST_TYPE,
            STATUS_CODE;

END @
4

2 に答える 2

1

ストアドプロシージャ(少なくともDB2では)で裸のselectステートメントを実行できるとは思いません。

これを試してみると、同じ結果が得られます。これまでで最も役に立たないエラーメッセージです。(IBMに感謝)

END FOR;しかし、問題がない後にいくつかの有効なステートメントを入れれば。

ストアドプロシージャで選択を実行して回答を表示する場合は、次のようにします。

CREATE OR REPLACE PROCEDURE DM_CHECKLIST()
    LANGUAGE SQL
    DYNAMIC RESULT SETS 1
BEGIN

DECLARE RS CURSOR FOR SELECT COUNT(*) FROM sysibm.sysdummy1;
OPEN RS;

END@

面白いのはDYNAMIC RESULT SETS 1ビジネスです。これは、結果セットが返され、コマンドラインインターフェイス(cli)に表示されることをエグゼキュータに通知します。

結果セットはいくつでも持つことができます。結果はCLIで表示されますが、実際に取得することもできます。

コマンドを試しましたが、EXPORT機能しなかったようです。

EXPORT TO "C:\TEMP\MARKETS.TXT" OF DEL SELECT COUNT(*) FROM sysibm.sysdummy1;

EXPORTこれはDB2コマンドであり、SQLステートメントではないため、ストアドプロシージャでの使用は許可されていないようです。それを行う方法があったとしても驚かないでしょうが、この方法ではありません。

于 2013-02-19T19:34:13.513 に答える
1

ストアード・プロシージャーで EXPORT ユーティリティーを使用するには、それを ADMIN_CMD プロシージャーでラップする必要があります。

create procedure dm_checklist()
    language sql
begin

    declare global temporary table results (...) 
        on commit preserve rows;

    -- Steps to build / populate your temporary table

    call sysproc.admin_cmd('export to C:\file.del of del select * from session.results');

end
于 2013-02-19T20:35:57.503 に答える