Имя динамической схемы BIRT 2.2
Вопрос
Можно ли сделать имя схемы динамическим в запросе BIRT.
Я попробовал это:
SELECT CURRENT DATE AS DATE,
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'
END) AS DAYOFWEEK
FROM **?**.COBOL_CALENDAR
WHERE SERVICE_DATE = CURRENT DATE"
Это генерирует следующую ошибку:Следующие элементы содержат ошибки:
ReportDesign (id = 1):
+ Cannot get the result set metadata.
SQL statement does not return a ResultSet object.
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N An unexpected token "?" was found following "". Expected tokens may include: "( TABLE FINAL <IDENTIFIER> XMLTABLE". SQLSTATE=42601
Но ?Кажется, работает только для предложенияwhere.
Мне нужно передать схему в качестве параметра и использовать ее динамически, поскольку она меняется в зависимости от dev/cat/prod.
нет ли какого-нибудь способа сгенерировать sql за пределами исходного xml и каким-то образом внедрить его??
Я еще немного поискал по этой теме и нашел это решение
<method name="beforeOpen"><![CDATA[this.queryText = "SELECT CURRENT DATE AS DATE, "+
"(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'"+
" WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'"+
" WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'"+
" WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'"+
" WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'"+
" WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'"+
" WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'"+
" END) AS DAYOFWEEK"+
"FROM "+params["SCHEMA"]+".COBOL_CALENDAR"+
" WHERE SERVICE_DATE = CURRENT DATE";]]></method>
Однако независимо от того, сколько примеров по этой проблеме существует, внедрение sql таким образом генерирует только следующую ошибку.
ReportDesign (id = 1):
+ Cannot get the result set metadata.
SQL statement does not return a ResultSet object.
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N An unexpected token "SCHEMANAME" was found following "". Expected tokens may include: ", FROM INTO". SQLSTATE=42601
Я даже попробовал reportContext.getParameterValue("SCHEMANAME")
маршрут с теми же результатами.
Решение
АРРР, это была дурацкая проблема с пробелами!!
"End) как dayofweek"+"из"+params ["schema"]+". Cobol_calendar"+
Добавление пробела перед FROM исправило ситуацию.
челка головой на ЖК-дисплее.
Другие советы
Похоже, вы отредактировали XML-источник своего отчета.Вот более графический способ замены произвольной строки в вашем SQL-запросе:
Напишите свой запрос следующим образом:
SELECT CURRENT DATE AS DATE,
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'
WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'
END) AS DAYOFWEEK
FROM dev.COBOL_CALENDAR
WHERE SERVICE_DATE = CURRENT DATE
Если dev
является допустимой схемой, теперь вы можете выбрать набор метаданных и по-прежнему можете заменить его параметром отчета.
Затем нажмите на свой набор данных и выберите вкладку «сценарий».Здесь вы выбираете «beforeOpen» и вводите скрипт замены:
this.queryText = this.queryText.replace("dev", params["SCHEMA"].value);
Таким образом вы замените строку dev
в тексте вашего запроса со значением вашего SCHEMA
Параметр перед выполнением запроса.Вы можете заменить каждую нужную строку (ссылка **?**
из вашего вопроса, но при наличии действительной схемы вы можете использовать набор метаданных на этапе проектирования.