DB2 9.7的SQL语法,我究竟做错了什么?(DB2 9.7 SQL syntax, what a

2019-11-01 14:50发布

对于一个原因或其它原因而这超出我的控制,我试图简单地将过去12个月的数据。 然而,实际上到数据的大小,我每天查询到一个临时表,并从那里走。 现在,我在DB2编写脚本,但不是SQL一般一个新手,所以我尝试下面的代码(逻辑上似乎没什么问题)。

起初我是多少条记录将被生成有兴趣,但理想的我想要运行的第二选择代码。 我一直在使用Data Studio,但我相信出口,我需要通过CLP来运行这个数据。 现在我的问题是我缺少的语法中的东西,我想不通,它的做我的头,它是最有可能的一些非常基本的或者说我只是做完全错误的。

如果我尝试我得到这些错误的SELECT COUNT(*)代码: - 多个标记在该行 - DB2用于Linux,UNIX和Windows:“从”“是后预计”。 - 用于Linux,UNIX和Windows上的DB2: “” 是无效的。

如果我尝试其他选择代码我得到这些错误: - DB2用于Linux,UNIX和Windows: “” 预期而不是“选择MARKET_ID,SUPER_REGION,地区,市场,POSA,DEST_ID,DEST_NAME,DEST_TYPE,STAT。 .. DB2用于Linux,UNIX和Windows。 “” 是 “GROUP” 结束后的预计: “” 是 “FROM” DB2用于Linux,UNIX和Windows后预计

我只是不明白这一点。 是否有人可以帮助? 该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 @

Answer 1:

我不认为你可以在一个存储过程做裸select语句(至少在DB2)。

当我尝试这个,我得到了相同的结果:最无用的错误消息不断。 (感谢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)的执行者。

只要你喜欢,你可以有很多的结果集。 你会看到在命令行的结果,或者你可以让他们务实。

我曾尝试EXPORT命令,它似乎并没有工作。

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

它看起来像你不能使用EXPORT在存储的过程,因为它是一个DB2命令,而不是一个SQL语句。 如果有一些方法来做到这一点,但不是这样,我也不会感到惊讶。



Answer 2:

使用导出工具在存储过程中,你必须把它包起来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


文章来源: DB2 9.7 SQL syntax, what am I doing wrong?