I have written a simple query in the <queryString>
tag inside a Jasper report
select s.BOARD_NUMBER, s.LOCATION_NAME, s.SHELF_NO, s.REGION_NAME, s.SERIAL_NUMBER, s.CARD_DISPLAYTYPE, s.CITY_NAME, s.PLUGGED_DATE, s.ROUTER_NAME
$P{searchMainCardType} == "CPM" ? from TM_PROCESSOR_CARD_INFO_VIEW s : from TM_DAUGHTER_CARD_INFO_VIEW
this query is run in iReport with a connection to an Oracle database. I have tested the query
select s.BOARD_NUMBER, s.LOCATION_NAME, s.SHELF_NO, s.REGION_NAME, s.SERIAL_NUMBER, s.CARD_DISPLAYTYPE, s.CITY_NAME, s.PLUGGED_DATE, s.ROUTER_NAME
from TM_PROCESSOR_CARD_INFO_VIEW s
it works well, but when I use the ternary operator in the first query i get the error
Error filling print... Error executing SQL statement for : unpluggedSwitchesHaes
net.sf.jasperreports.engine.JRException: Error executing SQL statement for : unpluggedSwitchesHaes at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:240) at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1114) at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:691) at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1314) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:931) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:873) at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:87) at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:287) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:760) at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:891) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) Caused by: java.sql.SQLException: Missing IN or OUT parameter at index:: 2 at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2076) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4790) at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4845) at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1501) at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:233) ... 11 more
what have I done wrong ?
Edit: after doing more research it turns out that the parameter value is not being correctly taken:
<parameter name="searchMainCardType" class="java.lang.String"/>
<queryString>
<![CDATA[select s.BOARD_NUMBER, s.LOCATION_NAME, s.SHELF_NO, s.REGION_NAME, s.SERIAL_NUMBER, s.CARD_DISPLAYTYPE, s.CITY_NAME, s.PLUGGED_DATE, s.ROUTER_NAME
from $P{searchMainCardType} s]]>
</queryString>
it's been evaluated as '?'
does anyone know the reason ? thanks.
You can not mix languages in query string. But if you declare cardTable
parameter with following default value expression :
( “CPM”.equals($P{searchMainCardType})
? “TM_PROCESSOR_CARD_INFO_VIEW”
: “TM_DAUGHTER_CARD_INFO_VIEW”
) + “ a”
So you can use in query string:
SELECT s.BOARD_NUMBER
FROM $P!{cardTable}
Note the exclamation mark !
, that will force a string replacement including table alias s
instead of value escaping and placeholding.