Pregunta

¿Es posible hacer que el nombre del esquema sea dinámico en una consulta BIRT?

He intentado esto:

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"

Esto genera el siguiente error: Los siguientes elementos tienen errores:

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

Pero el? Solo parece funcionar para la cláusula where.

Necesito pasar el esquema como parámetro y usarlo dinámicamente porque cambia basado en dev / cat / prod

¿no hay alguna forma de generar un exterior de sql del birt xml e inyectarlo de alguna manera?

Hice más búsquedas sobre el tema y encontré esta solución

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

Sin embargo, independientemente de la cantidad de ejemplos que haya sobre este problema, la inyección de SQL de esta manera solo genera el siguiente error.

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

Incluso probé la ruta reportContext.getParameterValue (" SCHEMANAME ") con los mismos resultados.

¿Fue útil?

Solución

¡ARRRGH fue un problema estúpido con espacios!

" FIN) COMO DAYOFWEEK " + " FROM " + params [" SCHEMA "] + " .COBOL_CALENDAR " +

Agregar un espacio delante del FROM lo ha arreglado.

golpea la cabeza en la pantalla lcd.

Otros consejos

Parece que ha editado la fuente XML de su informe. Aquí hay una manera más gráfica de reemplazar una cadena arbitraria en su consulta SQL:

Escriba su consulta de la siguiente manera:

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

Si dev es un esquema válido, ahora puede seleccionar el conjunto de metadatos y aún puede reemplazarlo con un parámetro de informe.

A continuación, haga clic en su conjunto de datos y seleccione la secuencia de comandos " " Lengüeta. Aquí seleccionas " antesAbrir " e ingrese el código de reemplazo:

this.queryText = this.queryText.replace("dev", params["SCHEMA"].value);

De esta manera reemplaza el String dev en el texto de su consulta con el valor de su SCHEMA Parámetro antes de ejecutar la consulta. Podría reemplazar todas las cadenas que desee (linke **? ** de su pregunta, pero con un esquema válido, en primer lugar, puede usar el conjunto de metadatos para la fase de diseño. ingrese la descripción de la imagen aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top