我们有一个hyperion应用程序,其源是Oracle EBS。我们有一个oracle软件包,可以从oracle EBS表的组合中提取数据并将其转储到hyperion应用程序中。现在,我们正在尝试通过集成的jython复制oracle软件包的相同功能,但遇到性能问题
现有的oracle软件包,遵循以下结构。
-光标选择所有有效的GL标头ID和行ID
CURSOR gl_ (
period VARCHAR2,
cat VARCHAR2,
source VARCHAR2
)
IS
SELECT p_header_id , p_line_num …...
-光标针对这些有效的标头ID和行号提取数据
CURSOR ytd_val (p_header_id NUMBER, p_line_num NUMBER)
IS SELECT …..
-遍历两个游标并在表中插入数据
FOR i IN gl_ (v_period_name, v_category, v_source)
LOOP
FOR j IN ytd_ (i.je_header_id, i.je_line_num)
LOOP
accounted_dr := 0;
accounted_cr := 0;
IF j.amount >= 0
THEN
accounted_dr := ABS (j.amount);
ELSE
accounted_cr := ABS (j.amount);
END IF;
INSERT INTO hyp_ytd_data ……
-JYTHON中的复制品
from __future__ import with_statement
from com.ziclix.python.sql import zxJDBC
import csv
from timeit import default_timer as timer
-- setting connection
try :
conn = zxJDBC.connect("<connection details>")
cursor = conn.cursor()
fdmAPI.logDebug("Connection successfully created")
except :
fdmAPI.logDebug("Connection not successfull")
--cursor to get the valid head lines and je lines
cursor.execute("""SELECT je_header_id, je_line_num .....)
itr = cursor.fetchall()
conn.close()
i = 1
--getting relevant data against these valid gl headers and lines
for x in itr:
start = timer()
conn2 = zxJDBC.connect(
cursor2 = conn2.cursor()
cursor2.execute("<DATA QUERY>")
itr2 = cursor2.fetchall()
end = timer()
-- to check the time taken by each iteration
fdmAPI.logDebug("Time for Iteration:%s is %s" % (i, str(end - start)))
i = i + 1
with open("D:/test_cursor.csv", 'a') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(itr2)
conn2.close()
时间差很大。虽然oracle代码仅花费大约10分钟,但是jython代码花费3个小时甚至更多。不知道我在哪里可能会出错。请帮助。
谢谢, 开发人员