понедельник, 27 декабря 2010 г.

Показываем в Операторе результат SQL запроса или содержимое файла.

На днях понадобилось мне прочитать содержимое файла, который лежит на том же сервере, где работает агент ODI. Но доступа к этому серверу, например, через ftp, у меня не было.
Но есть Oracle Data Integrator, который мне в этом и помог.

Итак, базируясь на вот этой заметке об отображении результата запроса в Операторе, приступим.

Вводная часть

Вывод строки в Операторе осуществляется уже известным нам способом вызова исключительной ситуации, точно такой способ используется для отображения значения переменных.

Получение данных из БД для их последующего вывода использует функцию из методов подстановки ODI под названием odiRef.getJDBCConnection. Функция осуществляет соединение с СУБД используя настройки топологии, хранящиеся в репозитории, и к которым у разработчика, в принципе, может и не быть доступа.

Общий алгоритм вывода информации - получение необходимого в виде строки с разделителями, затем вызов исключения с передачей результирующей строки как параметра этого исключения.

Для работы примеров необходимо создать процедуру ODI, в которой достаточно создать один шаг. Для вкладки Command on Target ставим технологию Jython, для вкладки Command on Source устанавливаем необходимую технологию для нашей СУБД и выбираем схему, в которой находится нужная нам таблица:


Код, показанный ниже, добавляем во вкладку для выполнения в целевой области, в области источника никакого кода нет:


Показываем результат выполнения Select-а в Операторе

import string
import java.sql as sql
import java.lang as lang

sourceConnection = odiRef.getJDBCConnection("SRC")
sqlstring = sourceConnection.createStatement()
result = sqlstring.executeQuery("select band_type_cd, band_type_en_name from dd_work.band_type order by 1")
i = 0
rs = []
rs.append('N\t'+'band_type_cd'+'\t'+'band_type_en_name')
while (result.next()):
  rs.append(str(i)+'\t'+str(result.getString("band_type_cd"))+'\t\t'+str(result.getString("band_type_en_name"))+' , ')
  i = i+1

res = '\n'.join(map(string.strip,rs))
sourceConnection.close()

raise res


Результаты:

Показываем количество строк в Операторе

import string
import java.sql as sql
import java.lang as lang

rs = ''
sourceConnection = odiRef.getJDBCConnection("SRC")

sqlstring = sourceConnection.createStatement()
sqlstmt="select count(*) as rowcount from dd_work.band_type"
result=sqlstring.executeQuery(sqlstmt)
while result.next():
  count=result.getInt("rowcount")

rs='\n'+str(sqlstmt)+'\n\n'+str(count)
sourceConnection.close()

raise rs


Результаты:

Показываем содержимое папки на сервере

import string
import java.sql as sql
import java.lang as lang
import os

rs = 'folder: /scripts/D/WORK/'+'\n'

for item in os.listdir('/scripts/D/WORK/'):
  if os.path.isfile(os.path.join('/scripts/D/WORK/', item)):
    rs = rs + item + '\n'

raise rs


Результаты:


Показываем содержимое файла на сервере

import string
import java.sql as sql
import java.lang as lang

srcfile=open('/scripts/D/WORK/HD_FL.196034105.log','r')
rs = ''
line=srcfile.readline()
i=0
while line:
  rs = rs + line
  line=srcfile.readline()
  i = i+1
srcfile.close()

raise rs


Результаты:

Будьте внимательны при использовании примеров. Jython очень чувствителен к соблюдению отступов в циклах и условиях.

Комментариев нет:

Отправить комментарий