簡體   English   中英

DB2 9.7 SQL語法,我在做什么錯?

[英]DB2 9.7 SQL syntax, what am I doing wrong?

由於某種原因或其他我無法控制的原因,我試圖在過去12個月中簡單地提取數據。 但是,從本質上講,要縮小到數據的大小,我必須每天查詢一個臨時表並從那里進行查詢。 現在,我是使用DB2編寫腳本的新手,但通常不是SQL,所以我嘗試了下面的代碼(邏輯對我而言似乎不錯)。

最初,我只是對要生成多少記錄感興趣,但是理想情況下,我想運行第二個SELECT代碼。 我一直在使用Data Studio,但我相信要導出數據,我需要通過CLP運行它。 現在我的問題是,我丟失了我無法弄清楚的語法中的某些內容,這正在全神貫注。這很可能是非常基本的內容,或者我只是完全錯誤地這樣做。

如果我嘗試使用SELECT COUNT(*)代碼,則會出現以下錯誤:-這行有多個標記-Linux,UNIX和Windows的DB2:在“ FROM”之后應加上“”。 -Linux,UNIX和Windows的DB2:“。” 是無效的。

如果嘗試其他SELECT代碼,則會出現以下錯誤:-適用於Linux,UNIX和Windows的DB2:應使用“”代替“ SELECT MARKET_ID,SUPER_REGION,REGION,MARKET,POSA,DEST_ID,DEST_NAME,DEST_TYPE,STAT。 ..用於Linux,UNIX和Windows的DB2:“,”應在“ FROM”之后。用於Linux,UNIX和Windows的DB2:“,”應在“ 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 @

我認為您不能在存儲的proc中(至少在DB2中)執行裸選擇語句。

當我嘗試此操作時,會得到相同的結果:有史以來最無用的錯誤消息。 (感謝IBM)

但是,如果我在END FOR;之后放置一些有效的語句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;

看起來您不允許在存儲的proc中使用EXPORT ,因為它是DB2命令而不是SQL語句。 如果有某種方法可以使我感到驚訝,但不是這樣。

要在存儲過程中使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM