Pl / sql% RowType в JDBC - PullRequest
       4

Pl / sql% RowType в JDBC

6 голосов
/ 13 июня 2011

Я пытался выполнить хранимую процедуру Oracle, которая возвращает% ROWTYPE, используя JDBC, как я упоминал ниже

  OracleCallableStatement ocs = (OracleCallableStatement)conn.prepareCall("begin <PackageName>.procedureName(?,?,?,?); end; ");
  ocs.setString(1, "001");
  ocs.registerOutParameter(2,java.sql.Types.VARCHAR);
  ocs.registerOutParameter(3,java.sql.Types.VARCHAR);
  ***ocs.registerOutParameter(4,java.sql.Types.OTHER);*** /*here What do i need to put, i didn't find Wrapperclass which is compatible for %ROWTYPE*/

 ocs.executeUpdate(); 

 String newerrorcode =  ocs.getString(2);

System.out.println("\n ErrorCode = " + newerrorcode );
String newErrorDesc =  ocs.getString(3);

System.out.println("\n ErrorDesc = " + newErrorDesc );
ResultSet rs = (ResultSet) ocs.getObject(4);

исключение: мы получаем следующее

Exception in thread "main" java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PR_APP_DATE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:202)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1005)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530)
at oracle.jdbc.driver.OracleCallableStatement.executeUpdate(OracleCallableStatement.java:4735)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
at testSysBusinessDts.main(testSysBusinessDts.java:62)

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Простой ответ: используйте JPublisher и сопоставьте типы, созданные JPublisher, с отображением типа соединения JDBC.

Длинный ответ: ни спецификация JDBC, ни драйвер Oracle JDBC не позволяют автоматически преобразовывать пользовательские (определяемые пользователем) типы в объекты Java и наоборот. Для этого должно быть установлено сопоставление типов, чтобы драйвер мог читать и записывать в соединение соответствующим образом. Хотя драйвер Oracle JDBC допускает чтение и запись определенных типов SQL, используя классы oracle.sql.*, его нельзя применять к UDT, поскольку структура UDT не может быть известна заранее. Использование JPublisher решает эту проблему, так как создает классы, отражающие структуру UDT; как только эти классы учитываются драйвером Oracle JDBC, он может читать соответствующие типы из набора результатов или может записывать объекты этих типов в поток подключения.

1 голос
/ 13 июня 2011

Я сделал нечто похожее на то, что вы просите. Хитрость заключалась в том, чтобы объявить refcursor типа row и объявить возвращение как курсор. В другом месте я нашел такой же результат, надеюсь, он вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...