使用jython中的游标复制Oracle游标的功能

时间:2019-04-20 18:22:13

标签: sql oracle jython cursors

我们有一个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个小时甚至更多。不知道我在哪里可能会出错。请帮助。

谢谢, 开发人员

0 个答案:

没有答案