Копирование функциональности курсоров оракула с курсорами в Jython - PullRequest
0 голосов
/ 20 апреля 2019

У нас есть приложение-гиперион, источником которого является Oracle EBS.У нас есть пакет oracle, который извлекает данные из комбинации таблиц Oracle EBS и выгружает их в приложение hyperion.Сейчас мы пытаемся повторить ту же функциональность пакета oracle через интегрированный jython, но сталкиваемся с проблемами производительности

Существующий пакет oracle следует следующей структуре:

- курсор для выбора всехдействительные идентификаторы заголовка GL и идентификаторы строк

CURSOR gl_ (
         period     VARCHAR2,
         cat  VARCHAR2,
         source     VARCHAR2
      )
      IS
         SELECT p_header_id , p_line_num …...

- курсор для извлечения данных по этим действительным идентификаторам заголовков и номерам строк

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 ……

- REPLICATION IN 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()

Разница во времени значительна.В то время как код оракула занимает всего около 10 минут, код Jython занимает 3 часа и более.Не уверен, где я могу пойти не так здесь.Пожалуйста, помогите.

Спасибо, Дев

...