Oracle
 sql >> база данни >  >> RDS >> Oracle

Не може да се вмъкнат Varchar2 данни чрез съхранена процедура с тип таблица като IN параметър

Някои малки промени от вашия код - използване на oracle.sql.ARRAY вместо java.sql.Array и след това с помощта на OracleConnection.setARRAYAtName() вместо Connection.setObject() за обвързване на параметъра.

(Забележка:това работи с помощта на Oracle Driver ojdbc6.jar с Oracle 11.2.0.1)

Настройка на Oracle;

CREATE TYPE rec_type AS OBJECT( id NUMBER, descr VARCHAR2(100) );
/
CREATE TYPE tab_type AS TABLE OF rec_type;
/
CREATE TABLE bom OF rec_type;
/
CREATE PROCEDURE pBom( t IN tab_type )
IS
BEGIN
  FORALL i IN INDICES OF t
    INSERT INTO bom VALUES t(i);
END;
/

Java :

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleCallableStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

public class TestDatabase2 {
  public static void main(String args[]){
    Connection con = null;
    try{
      Class.forName("oracle.jdbc.OracleDriver");

      con = DriverManager.getConnection(
        "jdbc:oracle:thin:@localhost:1521:XE",
        "username",
        "password"
      );

      ArrayDescriptor des = ArrayDescriptor.createDescriptor("TAB_TYPE", con);

      Object[] o1 = { 1, "ABC" };
      Object[] o2 = { 3, "DEF" };
      Object[] o3 = { 2, "GHI" };

      ARRAY objs = new ARRAY( des, con, new Object[][]{ o1, o2, o3 } );

      CallableStatement st = con.prepareCall("{ call pBOM( :arr )}");

      ((OracleCallableStatement) st).setARRAYAtName( "arr", objs );

      st.execute();
    } catch(ClassNotFoundException | SQLException e) {
      System.out.println(e);
    } finally {
       try {
         if ( con != null )
         {
           con.close();
         }
       } catch ( SQLException e ){}
    }
  }
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Решение да не може да изпълни DML операция в заявка?

  2. Дървовидна структура в sql в Oracle. Как да покажа дърво, дъщерни възли и родителски възли в SQL Oracle

  3. Как да дадете уникално ограничение на комбинация от колони в Oracle?

  4. Резервиране на Oracle RAC N+1

  5. Oracle - Не може да се използва знак * с друга колона в клаузата за избор