АРХИВ ПО ТЭГУ "ORACLE"
ИЮНЬ 25, 2012

Hi,

Note on ORACLE of how to find referencing table by constraint name: select constraint_name, table_name from user_constraints where constraint_name like ‘%MyConstraintName’;

АВГУСТ 19, 2011

oracle hate sux Grails/Java   Insert LARGE CLOB into Oracle 9i %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Hi.

Ох уж этот оракл, юзабильность это не о нем.

На этот раз проблема с Oracle 9i драйвером для Java. Возникла проблема сохранения CLOB / BLOB данных в базу, используя драйвер для Oracle 9i. На 10g все вроде как даже работает..

Так вот когда пытаешься работать с CLOB / BLOB, то возникают различные ексепшены типа

  • java.sql.SQLException: Data size bigger than max size for this type: 50584
  • java.sql.SQLException: operation not allowed: streams type cannot be used in batching
Аха, можете попробовать, ни для какого типа данных у меня не получилось сохранить большой объект простым способом. А я пробовал много чего: CLOB, BLOB, LONG, LONG RAW. Но фига — больше 4-50kb не сохраняет.
В итоге пришел к изврашенному решению описанному где то в потайных документациях оракла. Решение использует Java JDBC для сохранения модели если это оракл драйвер версии 9. Для других баз и других версий оракла будет использоваться стандартное сохранение доменного класса Grails.
Моделька Grails
package my.com
  1.  
  2. class MyDomain {
  3.  
  4.  String bigData
  5.  
  6.  static constraints = {
  7.   bigData(maxSize: 1024 * 1024) // 1 MB
  8.  }
  9.  
  10.  static mapping = {
  11.   bigData type:"text" // this will create CLOB data type column
  12.  }
  13. }
Методы сервиса для сохранения большого CLOB’а
def isOracle9Driver = {
  1.   boolean isOracle9 = false
  2.  
  3.   try {
  4.    Connection conn = sessionFactory.getCurrentSession().connection()
  5.    DatabaseMetaData dbmd = conn.getMetaData()
  6.  
  7.    if (dbmd != null) {
  8.     String dbName = dbmd.getDatabaseProductName()
  9.     String dbDriverVer = dbmd.getDriverVersion()
  10.  
  11.     if ("Oracle".equals(dbName) && (dbDriverVer != null && dbDriverVer.startsWith("9."))) {
  12.      isOracle9 = true
  13.     }
  14.    }
  15.   } catch (Exception e) {
  16.    log.warn "Error getting DB Driver version — " + e.getMessage()
  17.    e.printStackTrace()
  18.   }
  19.  
  20.   return isOracle9
  21.  }
  22.  
  23.  def saveMyDomain(def bigData) {
  24.  
  25.   // RAW SQL USING JDBC FOR Oracle 9i DRIVER
  26.   if (isOracle9Driver()) {
  27.  
  28.    Connection conn = sessionFactory.getCurrentSession().connection()
  29.    PreparedStatement stmt
  30.    CallableStatement callableStmt
  31.  
  32.    try {
  33.  
  34.     //
  35.     // Insert new entry with empty clob
  36.     String sql = "BEGIN INSERT INTO my_domain (id,version,big_data) values (HIBERNATE_SEQUENCE.NEXTVAL,1,empty_clob()) RETURNING id INTO ?; END;"
  37.     callableStmt = conn.prepareCall(sql)
  38.     callableStmt.registerOutParameter(1, Types.INTEGER);
  39.     callableStmt.executeUpdate()
  40.  
  41.     long newId = callableStmt.getLong(1)
  42.     if (newId < 0) {
  43.      throw new IllegalStateException("Cannot get autogenerated ID of my_domain: got id=" + newId)
  44.     }
  45.     callableStmt.close()
  46.  
  47.     //
  48.     // Select for update
  49.     sql = "SELECT big_data FROM my_domain WHERE id=? FOR UPDATE"
  50.     stmt = conn.prepareStatement(sql)
  51.     stmt.setLong(1, newId)
  52.  
  53.     ResultSet rss = stmt.executeQuery()
  54.     if (!rss.next()){
  55.      throw new IllegalStateException("Cannot get result for 'select for update' of my_domain")
  56.     }
  57.  
  58.     //
  59.     // Update create entry with clob data
  60.     CLOB clob = (CLOB) rss.getClob("big_data")
  61.     clob.putString(1, bigData)
  62.  
  63.     sql = "UPDATE my_domain SET big_data=? WHERE id=?"
  64.     stmt = conn.prepareStatement(sql)
  65.     stmt.setClob(1, clob)
  66.     stmt.setLong(2, newId)
  67.     stmt.executeUpdate()
  68.     stmt.close()
  69.  
  70.     conn.commit()
  71.  
  72.     } catch (Exception e) {
  73.      log.error "Cannot save my_domain — " + e.getMessage()
  74.      e.printStackTrace()
  75.      conn.rollback()
  76.     } finally {
  77.      if (callableStmt != null) callableStmt.close()
  78.      if (stmt != null) stmt.close()
  79.     }
  80.   } else {
  81.    // DOMAIN CLASS SAVE
  82.    new MyDomain(
  83.      bigData: bigData
  84.     ).save(flush:true)
  85.   }
  86.  }
АВГУСТ 17, 2011

work with me Работка нужна кому? Питер, мобайл дев %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Hi.

Приветик дудекос.

Кто хочет поработать со мной ну и ваобще с крутанскими чувачками, пока что удаленно, а вскоре в питерском офисе?

Нужны сотоны по:

  • Java/Android
  • Obj-C/C++/iPhone
  • Java/JEE/Groovy/Grails; SQL (Oracle, MySQL)
К кому обращаться:
  • Ну если интересно пишите мне icon smile Работка нужна кому? Питер, мобайл дев %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8
  • Или сразу Саньку заливайте резюмку на godexsoft [at] gmail [dot] com.
PS Не забудьте — сегодня El Classico в час ночи по Москве! Смотреть обязатеельно! Первый матч 2-2, хотя Реал выглядил намного сильнее!