This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.
Netbeans throws error while generating WSDL file for SQL Module which uses Oracle DB and Oracle JDBC driver: java.sql.SQLException: Handle does not exist: getMetaData at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229) at oracle.jdbc.driver.OracleResultSetImpl.getMetaData(OracleResultSetImpl.java:141) at oracle.jdbc.driver.OraclePreparedStatement.getMetaData(OraclePreparedStatement.java:4091) at oracle.jdbc.driver.OraclePreparedStatementWrapper.getMetaData(OraclePreparedStatementWrapper.java:1498) at org.netbeans.modules.sql.project.dbmodel.DBMetaData.getPrepStmtResultSetColumns(DBMetaData.java:1858) at org.netbeans.modules.sql.project.dbmodel.DBMetaData.getPrepStmtMetaData(DBMetaData.java:711) at org.netbeans.modules.sql.project.dbmodel.DBMetaData.getPrepStmtMetaData(DBMetaData.java:737) at org.netbeans.modules.sql.project.wsdl.WSDLGenerator.generateSelectSchemaElements(WSDLGenerator.java:935) at org.netbeans.modules.sql.project.wsdl.WSDLGenerator.modifyMessageTypes(WSDLGenerator.java:412) at org.netbeans.modules.sql.project.wsdl.WSDLGenerator.modifyWSDL(WSDLGenerator.java:353) at org.netbeans.modules.sql.project.wsdl.WSDLGenerator.generateWSDL(WSDLGenerator.java:321) at org.netbeans.modules.sql.project.wsdl.GenFiles.execute(GenFiles.java:266) at org.netbeans.modules.sql.project.wsdl.GenFiles.actionPerformed(GenFiles.java:151) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.AbstractButton.doClick(AbstractButton.java:357) at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1220) at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1261) at java.awt.Component.processMouseEvent(Component.java:6041) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5806) at java.awt.Container.processEvent(Container.java:2058) at java.awt.Component.dispatchEventImpl(Component.java:4413) at java.awt.Container.dispatchEventImpl(Container.java:2116) at java.awt.Component.dispatchEvent(Component.java:4243) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) at java.awt.Container.dispatchEventImpl(Container.java:2102) at java.awt.Window.dispatchEventImpl(Window.java:2440) at java.awt.Component.dispatchEvent(Component.java:4243) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) at java.awt.EventDispatchThread.run(EventDispatchThread.java:121) Oracle driver can't get metadata for statement which wasn't executed. I have decompiled org.netbeans.modules.sql.project.dbmodel.DBMetaData and fixed it slightly: private ResultSetColumn[] getPrepStmtResultSetColumns(PreparedStatement preparedstatement) throws SQLException { String s = ""; errPrepStmtResultSetColumns = false; ResultSetColumn aresultsetcolumn[] = null; + try { + int i=0; + try { + while(true) + preparedstatement.setNull(++i, java.sql.Types.NULL); + } + catch (SQLException sqe) + { + // sqe.printStackTrace(); + // usually no more parameters to bind + } + preparedstatement.execute(); + } + catch (Exception e) {} try { ResultSetMetaData resultsetmetadata = preparedstatement.getMetaData(); int i = 0; if(resultsetmetadata != null) i = resultsetmetadata.getColumnCount(); else errPrepStmtResultSetColumns = true; if(i > 0) { aresultsetcolumn = new ResultSetColumn[i]; for(int j = 1; j <= i; j++) { ResultSetColumn resultsetcolumn = new ResultSetColumn(); resultsetcolumn.setName(resultsetmetadata.getColumnName(j)); resultsetcolumn.setSqlType(getSQLTypeDescription(resultsetmetadata.getColumnType(j))); resultsetcolumn.setJavaType(getJavaFromSQLTypeDescription(resultsetcolumn.getSqlType())); resultsetcolumn.setOrdinalPosition(j); resultsetcolumn.setNumericPrecision(resultsetmetadata.getPrecision(j)); resultsetcolumn.setNumericScale(resultsetmetadata.getScale(j)); if(resultsetmetadata.isNullable(j) == 1) resultsetcolumn.setIsNullable(true); else resultsetcolumn.setIsNullable(false); aresultsetcolumn[j - 1] = resultsetcolumn; } } } catch(SQLException sqlexception) { errPrepStmtResultSetColumns = true; aresultsetcolumn = null; sqlexception.printStackTrace(); String s1 = sqlexception.getLocalizedMessage(); throw sqlexception; } return aresultsetcolumn; }
Maybe for databases which don't support getting statement metadata before statement execution there should be some dialog box asking for standard parameters for binding. Here is WSDL generated for 'select sysdate as s1, sysdate+1 as s2 from dual' with applied patch: <?xml version="1.0" encoding="UTF-8"?> <definitions name="SQLApp1" targetNamespace="http://com.sun.jbi/sqlse/sqlseengine" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://com.sun.jbi/sqlse/sqlseengine" xmlns:slnk="http://schemas.xmlsoap.org/ws/2002/07/service-link/" xmlns:plink="http://docs.oasis-open.org/wsbpel/2.0/plnktype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> <types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://com.sun.jbi/sqlse/sqlseengine" xmlns="http://com.sun.jbi/sqlse/sqlseengine"> <xsd:element name="sysdateRequest"> <xsd:complexType> <xsd:sequence/> </xsd:complexType> </xsd:element> <xsd:element name="sysdateResponse"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="unbounded" ref="record"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="record"> <xsd:complexType> <xsd:sequence> <xsd:element name="S1" type="xsd:string"/> <xsd:element name="S2" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </types> <message name="sysdateRequest"> <part name="sysdateRequestPart" element="tns:sysdateRequest"/> </message> <message name="sysdateResponse"> <part name="sysdateResponsePart" element="tns:sysdateResponse"/> </message> <portType name="SQLApp1_sqlsePortType"> <operation name="sysdate"> <input name="sysdateRequest" message="tns:sysdateRequest"/> <output name="sysdateResponse" message="tns:sysdateResponse"/> </operation> </portType> <binding name="SQLApp1Binding" type="tns:SQLApp1_sqlsePortType"> <operation name="sysdate"> <input name="sysdateRequest"> </input> <output name="sysdateResponse"> </output> </operation> </binding> <service name="SQLApp1_sqlseService"> <port name="SQLApp1_sqlsePort" binding="tns:SQLApp1Binding"> </port> </service> <plink:partnerLinkType xmlns:plink="http://docs.oasis-open.org/wsbpel/2.0/plnktype" name="SQLApp1_sqlsePartnerLinkType"> <plink:role name="SQLApp1_myrole" portType="tns:SQLApp1_sqlsePortType"/> </plink:partnerLinkType> </definitions> Result is not 100% correct, however better than nothing.
also resultsetcolumn.setName(resultsetmetadata.getColumnName(j)); resultsetcolumn.setSqlType(getSQLTypeDescription(resultsetmetadata.getColumnType(j))); resultsetcolumn.setJavaType(getJavaFromSQLTypeDescription(resultsetcolumn.getSqlType())); try { resultsetcolumn.setOrdinalPosition(j); } catch (Exception e) {} try { resultsetcolumn.setNumericPrecision(resultsetmetadata.getPrecision(j)); } catch (Exception e) {} try { resultsetcolumn.setNumericScale(resultsetmetadata.getScale(j)); } catch (Exception e) {} would help. If I have free time I can try to install Mercurial, download source and deliver patch.
Created attachment 63323 [details] Fix for generating WSDL from SQL using Oracle JDBC driver
Created attachment 63324 [details] Fixed SQL Module jar
Changed target milestone.
http://systest.googlecode.com/files/org-netbeans-modules-sql-project.jar Here is SOA2 SQL module fixed for Oracle select, insert, update, delete and call operations. Class org.netbeans.modules.sql.project.dbmodel.DBMetaData was taken from soa-dev65.