Stored procedures SQL错误:DB2SQL错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=AS;仅前100行);),驾驶员=3.57.82
下面的DB2存储过程已成功编译,但获取运行时错误SQL错误:DB2SQL错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=AS;仅前100行;,驾驶员=3.57.82 下面db2过程的目的是使用准备好的语句从多个表中删除记录Stored procedures SQL错误:DB2SQL错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=AS;仅前100行);),驾驶员=3.57.82,stored-procedures,db2,prepared-statement,Stored Procedures,Db2,Prepared Statement,下面的DB2存储过程已成功编译,但获取运行时错误SQL错误:DB2SQL错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=AS;仅前100行;,驾驶员=3.57.82 下面db2过程的目的是使用准备好的语句从多个表中删除记录 CREATE PROCEDURE ALL_DATA_PURGE1(IN v_SCHEMA_NAME VARCHAR(24),IN v_DAYS INTEGER, IN v_COMMIT_COUNT INTEGER) NOT DETERM
CREATE PROCEDURE ALL_DATA_PURGE1(IN v_SCHEMA_NAME VARCHAR(24),IN v_DAYS INTEGER, IN v_COMMIT_COUNT INTEGER)
NOT DETERMINISTIC
LANGUAGE SQL
BEGIN
-- DECLARE Statements
DECLARE SQLCODE INTEGER;
DECLARE v_CRAD_DELETE_QUERY VARCHAR(1024);
DECLARE v_APPDATA_DELETE_QUERY VARCHAR(1024);
DECLARE v_CRAD_DELETE_STATEMENT STATEMENT;
DECLARE v_APPDATA_DELETE_STATEMENT STATEMENT;
SET v_CRAD_DELETE_QUERY = 'DELETE FROM (SELECT 1 FROM ' || v_SCHEMA_NAME || '.CRAD WHERE UNIQUE_ID IN
(SELECT UNIQUE_ID FROM ' || v_SCHEMA_NAME || '.APPDATA WHERE ORIGINATOR_TIMESTAMP < (
SELECT CURRENT TIMESTAMP - '|| v_DAYS ||' DAYS FROM SYSIBM.SYSDUMMY1)
) FETCH FIRST ' || v_COMMIT_COUNT || ' ROWS ONLY) AS DELETE_CRAD_TABLE';
SET v_APPDATA_DELETE_QUERY = 'DELETE FROM (SELECT 1 FROM ' || v_SCHEMA_NAME || '.APPDATA WHERE SOME_TIMESTAMP < (
SELECT CURRENT TIMESTAMP - ' || v_DAYS || ' days FROM sysibm.sysdummy1
) FETCH FIRST ' || v_COMMIT_COUNT || ' ROWS ONLY) AS DELETE_APPDATA_TABLE';
PREPARE v_CRAD_DELETE_STATEMENT FROM v_CRAD_DELETE_QUERY;
PREPARE v_APPDATA_DELETE_STATEMENT FROM v_APPDATA_DELETE_QUERY;
DELETE_LOOP:
LOOP
EXECUTE v_CRAD_DELETE_STATEMENT;
EXECUTE v_APPDATA_DELETE_STATEMENT;
IF SQLCODE = 100 THEN
LEAVE DELETE_LOOP;
END IF;
COMMIT;
END LOOP;
COMMIT;
END
由于动态SQL语句未知,因此存储过程将进行编译。在运行时,DB2注意到您没有遵循它的语法规则。这些陈述看起来过于复杂,可以简化。您不需要从sysdummy1中进行选择-一些简单的表达式就可以了
在编写存储过程之前,您是否测试了各个语句?请编辑问题,以便存储过程完全显示为代码谢谢您的回答。我做了单独的测试,它的工作。请建议我如何简化这些复杂的查询。所有语法错误都已解决,我现在需要简化。示例:摆脱select。。。从sysdummy1中,它是一个简单的当前时间戳-v_Days DAYSThanks,完成并工作。哪种方法最适合从表中删除大量数据,可以是通过cursormy other question(我发布的另一个问题),也可以是上面的语句。对于删除基于日期/时间属性的大块数据,表通常是范围分区的。在这种情况下,只有符合条件的分区被分离。你调查过了吗?您申请的天数范围是多少?