由于某种原因或其他不受我控制的原因,我试图在过去12个月内简单地提取数据。但是,基本上只有数据的大小,我必须每天查询临时表并从那里开始。现在我是DB2中脚本的新手,但不是一般的SQL,所以我尝试了下面的代码(逻辑对我来说似乎很好)。
最初,我只对生成多少条记录感兴趣,但理想情况下我想要运行第二条SELECT代码。我一直在使用Data Studio,但我相信我需要通过CLP导出运行它的数据。现在我的问题是,我在语法中遗漏了一些我无法弄清楚的东西,而且它正在努力。它很可能是非常基本的东西,或者我只是完全错了。
如果我尝试SELECT COUNT(*)代码,我会收到以下错误: - 此行有多个标记 - 用于Linux,UNIX和Windows的DB2:“FROM”之后需要“”。 - DB2 for Linux,UNIX和Windows:“。”无效。
如果我尝试其他SELECT代码,我会收到这些错误: - DB2 for Linux,UNIX和Windows:预期“”而不是“SELECT MARKET_ID, SUPER_REGION, 区域, 市场, POSA, DEST_ID, DEST_NAME, DEST_TYPE, STAT ... DB2 for Linux,UNIX和Windows:在“FROM”之后需要“,”。 DB2 for Linux,UNIX和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 @
答案 0 :(得分:1)
我认为你不能在存储过程中做一个裸选择语句(至少在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语句。如果有某种方法,我不会感到惊讶,但不是这样。
答案 1 :(得分:0)
要在存储过程中使用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