【问题标题】:DB2 9.7 SQL syntax, what am I doing wrong?DB2 9.7 SQL 语法,我做错了什么?
【发布时间】:2023-03-07 12:51:01
【问题描述】:

出于某种我无法控制的原因,我试图简单地提取过去 12 个月的数据。但是,基本上取决于数据的大小,我必须每天查询一个临时表并从那里开始。现在我是在 DB2 中编写脚本的新手,但不是一般的 SQL,所以我尝试了下面的代码(逻辑对我来说似乎很好)。

最初我只是对将生成多少记录感兴趣,但理想情况下我想运行第二个 SELECT 代码。我一直在使用 Data Studio,但我相信导出我需要通过 CLP 运行它的数据。现在我的问题是,我在语法中遗漏了一些我无法弄清楚的东西,而且它正在引起我的注意。这很可能是非常基本的东西,或者我只是做错了。

如果我尝试 SELECT COUNT(*) 代码,我会收到以下错误:- 此行有多个标记 - DB2 for Linux, UNIX, and Windows:“”应该在“FROM”之后。 - DB2 for Linux、UNIX 和 Windows:“.”无效。

如果我尝试其他 SELECT 代码,我会收到以下错误:- DB2 for Linux, UNIX, and Windows: 应为“”而不是“SELECT MARKET_ID, 超级地区, 地区, 市场, POSA, DEST_ID, DEST_NAME, DEST_TYPE, 统计... 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 @

【问题讨论】:

  • 恐怕我无法为您解答,但您可能有兴趣下载一份DB2 SQL Cookbook 以供参考。

标签: sql loops db2 temp-tables


【解决方案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) 中。

您可以拥有任意数量的结果集。您将在 cli 上看到结果,或者您可以务实地获得它们。

我确实尝试了EXPORT 命令,但它似乎不起作用。

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

看起来您不允许在存储过程中使用EXPORT,因为它是 DB2 命令而不是 SQL 语句。如果有某种方法可以做到这一点,我不会感到惊讶,但不是这样。

【讨论】:

    【解决方案2】:

    要在存储过程中使用 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
    

    【讨论】:

      猜你喜欢
      • 2016-03-08
      • 2022-11-18
      • 1970-01-01
      • 2019-07-21
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      相关资源
      最近更新 更多