Search code examples
sqloracle-databasejasper-reports

Ternary operator causing Missing IN or OUT parameter at index


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. 


Solution

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