最近接到优化程序的工作,程序使用kettle编写,有一段业务处理,需要使用kettle遍历动态拼接执行SQL(数据库(oracle)中存储SQL的查询条件,例如:AND ITEM='K001');测试发现kettle遍历非常耗时(情理中,遍历在执行SQL,不耗时,就不正常了),再考虑到kettle遍历次数达到一定数量,基本就挂了;核心问题是kettle遍历耗时,并存在潜在的问题;有问题解决问题,不让kettle执行遍历工作,不就可以解决这个问题了吗?依据这个思路,我首先想到,遍历执行的SQL,使用数据库函数执行;有了方案,经过测试可以实现,并解决了核心问题。
1、创建函数
CREATE OR REPLACE FUNCTION "EXEC_SQL" (--参数P_PARAM1 IN VARCHAR2
) RETURN NUMBER AS--动态拼接SQLV_SQLS VARCHAR2(2000);--接手执行SQL的结果V_CNT NUMBER(30,2);
BEGIN--动态拼接SQLV_SQLS:='SELECT SUM(AMOUNT) AS TOTAL FROM TABLE_RELATION WHERE 1=1 '||P_PARAM1;--执行并返回结果EXECUTE IMMEDIATE V_SQLS INTO V_CNT;RETURN V_CNT;
END;
2、调用函数
SELECT EXEC_SQL('AND ITEM=''K001''') FROM DUAL