You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Ooi Leng Chye <ol...@silicomp.com.my> on 2003/05/16 08:18:40 UTC

Not all variable bind in HAVING sub query


Hi Everyone,

    I have encounter a problem when I write and try to execute a query
such as following. I get a "ORA-01008: not all variables bound" error, I
have tested both 1.0rc2 as well as 1.0rc3.

   Criteria c = new Criteria();
   c.addIn(Shipment.F_AWB, Arrays.asList(awbs));

   Criteria cH = new Criteria();
   cH.addGreaterThan("count(*)", new Integer(1));
		
   ReportQueryByCriteria q =
QueryFactory.newReportQuery(ShipmentImpl.class, c);
   q.setColumns(new String[] {"awbNo"});
   q.addGroupBy(Shipment.F_AWB);
   q.setHavingCriteria(cH);
		
   Criteria sC = new Criteria();
   sC.addIn("awbNo", q);		
   sC.addEqualToField(Shipment.F_AWB, "allPieceInShipment.trackingNo");
   ReportQueryByCriteria sQ =
QueryFactory.newReportQuery(ShipmentImpl.class, sC);
   sQ.setColumns(new String[]
{Shipment.F_SHIPMENT_OID,Shipment.F_DEST_LOCATION_CD,Shipment.F_AWB,"allPieceInShipment.pieceRouteLeg.routeDate","allPieceInShipment.pieceRouteLeg.routeNo"});
		
   Iterator it = pb.getReportQueryIteratorByQuery(sQ);


    I suspect this has to do with the HavingCriteria that I include in the
subquery. After carry out a debugging process, I found that the same piece
of code that I have written will work perfectly fine if I modify the method
  
org.apache.ojb.broker.accesslayer.StatementManager#bindStatementValue(PreparedStatement
stmt, int index, Object value, ClassDescriptor cld, FieldDescriptor fld)
throws SQLException

to the following

private int bindStatementValue(PreparedStatement stmt, int index, Object
value, ClassDescriptor cld, FieldDescriptor fld) throws SQLException
{
	// if value is a subQuery bind it
	if (value instanceof Query)
	{
		Query subQuery = (Query) value;
		if (subQuery.getCriteria() != null && subQuery.getCriteria().isEmpty())
		{
			index = bindStatement(stmt, subQuery.getCriteria(),
cld.getRepository().getDescriptorFor(subQuery.getSearchClass()), index);
		}
	
		// olc - 13 May 2003
		if(subQuery.getHavingCriteria()!=null &&
!subQuery.getHavingCriteria().isEmpty()) {
			index = bindStatement(stmt, subQuery.getHavingCriteria(),
cld.getRepository().getDescriptorFor(subQuery.getSearchClass()), index);
		}
		return index;
		}

		// if query has criteria, bind them
		if (fld != null)
		{
			// BRJ: use field conversions and platform
		        if (value != null)
			{
				m_platform.setObjectForStatement(stmt, index,
fld.getFieldConversion().javaToSql(value), fld.getColumnJdbcType());
			}
			else
			{
				m_platform.setNullForStatement(stmt, index, fld.getColumnJdbcType());
			}
		}
		else
		{
			// BRJ: No FieldDescriptor found
			if (value != null)
			{
				stmt.setObject(index, value);
			}
			else
			{
				stmt.setNull(index, Types.NULL);
			}
		}

		return ++index; // increment before return
	}


    Can anyone please veryfy this? Thank you!


Cheers,
Leng Chye, Ooi
Silicomp Malaysia Sdn Bhd

SELECT 
   A0.SHIPMENT_OID_NBR,
   A0.DEST_LOCATION_CD,
   A0.AWB_NBR 
FROM 
   ENT.SHIPMENT A0
WHERE 
   A0.AWB_NBR IN 
(
SELECT
   A0.AWB_NBR 
FROM
   ENT.SHIPMENT A0 
WHERE 
   A0.AWB_NBR IN ( ? , ? , ? , ? , ? , ? ) 
GROUP BY 
   A0.AWB_NBR HAVING count(*) =  ? 
)

SELECT
   A0.SHIPMENT_OID_NBR,
   A0.DEST_LOCATION_CD,
   A0.AWB_NBR
FROM
   ENT.SHIPMENT A0 
WHERE
   A0.AWB_NBR IN  
(
SELECT
   A0.AWB_NBR 
FROM
   ENT.SHIPMENT A0 
WHERE
   A0.AWB_NBR IN ( '840670042656' , '840669067472' , '840670042645' ,
'840669091249' , '840669091411' , '11123423232' )
GROUP BY
   A0.AWB_NBR 
HAVING count(*) =  null 
) 

[org.apache.ojb.broker.accesslayer.JdbcAccessImpl] ERROR: SQLException
during the execution of the query (for a com.fedex.data.ShipmentImpl):
ORA-01008: not all variables bound

ORA-01008: not all variables bound

java.sql.SQLException: ORA-01008: not all variables bound

	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
	at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
	at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:579)
	at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1894)
	at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:831)
	at
oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2496)
	at
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2840)
	at
oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
	at
oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:536)
	at
com.p6spy.engine.logging.P6LogPreparedStatement.executeQuery(P6LogPreparedStatement.java:171)
	at org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(Unknown
Source)
	at org.apache.ojb.broker.accesslayer.RsIterator.<init>(Unknown Source)
	at org.apache.ojb.broker.accesslayer.ReportQueryRsIterator.<init>(Unknown
Source)
	at
org.apache.ojb.broker.core.ReportRsIteratorFactoryImpl.createRsIterator(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getReportQueryIteratorFromQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getReportQueryIteratorByQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getReportQueryIteratorByQuery(Unknown
Source)
	at com.fedex.cih.ejb.LookupBean.getSingleShipmentList(LookupBean.java:136)
	at com.fedex.cih.util.TestDuplicatedAWB.main(TestDuplicatedAWB.java:59)
Exception in thread "main" java.sql.SQLException: ORA-01008: not all
variables bound
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
	at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
	at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:579)
	at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1894)
	at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:831)
	at
oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2496)
	at
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2840)
	at
oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
	at
oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:536)
	at
com.p6spy.engine.logging.P6LogPreparedStatement.executeQuery(P6LogPreparedStatement.java:171)
	at org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(Unknown
Source)
	at org.apache.ojb.broker.accesslayer.RsIterator.<init>(Unknown Source)
	at org.apache.ojb.broker.accesslayer.ReportQueryRsIterator.<init>(Unknown
Source)
	at
org.apache.ojb.broker.core.ReportRsIteratorFactoryImpl.createRsIterator(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getReportQueryIteratorFromQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getReportQueryIteratorByQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getReportQueryIteratorByQuery(Unknown
Source)
	at com.fedex.cih.ejb.LookupBean.getSingleShipmentList(LookupBean.java:136)
	at com.fedex.cih.util.TestDuplicatedAWB.main(TestDuplicatedAWB.java:59)
rethrown as org.apache.ojb.broker.PersistenceBrokerSQLException:
ORA-01008: not all variables bound
	at org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(Unknown
Source)
	at org.apache.ojb.broker.accesslayer.RsIterator.<init>(Unknown Source)
	at org.apache.ojb.broker.accesslayer.ReportQueryRsIterator.<init>(Unknown
Source)
	at
org.apache.ojb.broker.core.ReportRsIteratorFactoryImpl.createRsIterator(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getReportQueryIteratorFromQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.PersistenceBrokerImpl.getReportQueryIteratorByQuery(Unknown
Source)
	at
org.apache.ojb.broker.core.DelegatingPersistenceBroker.getReportQueryIteratorByQuery(Unknown
Source)
	at com.fedex.cih.ejb.LookupBean.getSingleShipmentList(LookupBean.java:136)
	at com.fedex.cih.util.TestDuplicatedAWB.main(TestDuplicatedAWB.java:59)
Caused by: java.sql.SQLException: ORA-01008: not all variables bound
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
	at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
	at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:579)
	at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1894)
	at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:831)
	at
oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2496)
	at
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2840)
	at
oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
	at
oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:536)
	at
com.p6spy.engine.logging.P6LogPreparedStatement.executeQuery(P6LogPreparedStatement.java:171)
	... 10 more