2012-01-11 2 views
0

У меня есть данные вроде (7A + 5dfAA7D ...) алфавита и цифр. Его длина больше, чем two lack символов. Поэтому я не могу обновить этот столбец clob, используя update, потому что он вызывает ошибку, говорящую строковый литерал слишком долго.Как обновить столбец CLOB массивными данными с помощью sql oracle?

Как обновить значения?

, пожалуйста, помогите мне.

Заранее благодарен!

+0

Какие обновления вы делаете: overwrsubiting? замена строки? добавление? – APC

+0

На самом деле это пустой столбец, просто обновляющийся с использованием простого запроса на обновление. –

+0

Вам нужно будет использовать PreparedStatement (или любую другую эквивалентную вещь, предлагаемую вашим языком программирования) –

ответ

0

Вот часть некоторого кода Java, который вставляет данные из файла в столбец CLOB. Хитрость состоит в том, чтобы сначала вставить значение empty_clob(), а затем обновить запись.

try { 
      /* Register the Oracle driver */ 
      DriverManager.registerDriver(new OracleDriver()); 

      /* Establish a connection to the Oracle database. I have used the Oracle Thin driver. 
       jdbc:oracle:[email protected]:port:sid, "user name", "password" */ 

      conn = DriverManager.getConnection(connectString, userName, passWord); 

      /* Set auto commit to false, it helps to speed up things, by default JDBC's auto commit feature is on. 
       This means that each SQL statement is commited as it is executed. */ 

      conn.setAutoCommit(false); 
      stmt = conn.createStatement(); 

      /* Insert all the data, for the BLOB column we use the function empty_blob(), which creates a locator for the BLOB datatype. 
       A locator is an object that ponts to the actual location of the BLOB data in the database. A locator is essential to manipulate BLOB data. */ 

      query = "INSERT INTO CLOB_TABLE (id,data_clob,bestandsnaam,dt_geplaatst) " + 
        "VALUES(" + ID + ", empty_clob(),\'" + fileName + "\',sysdate)"; 

      //System.out.println(query); 

      stmt.execute(query); 

      /* Once the locator has been inserted, we retrieve the locator by executing a SELECT statement 
       with the FOR UPDATE clause to manually lock the row. */ 

      query = "SELECT DATA_CLOB FROM CLOB_TABLE WHERE ID=\'" + ID + "\' FOR UPDATE"; 

      //System.out.println(query); 
      rs = stmt.executeQuery(query); 
      //System.out.println("Select statement uitgevoerd"); 

      if (rs.next()) { 

       /* Once a locator has been retrieved we can use it to insert the binary data into the database. */ 
       CLOB clob = (CLOB)((OracleResultSet)rs).getClob(1); 
       os = clob.getAsciiOutputStream(); 
       final File f = new File(fileName); 
       is = new FileInputStream(f); 
       final byte[] buffer = new byte[clob.getBufferSize()]; 
       int bytesRead = 0; 
       while ((bytesRead = is.read(buffer)) != -1) { 
        os.write(buffer, 0, bytesRead); 
       } 
       clob = null; 
       returnValue = 0; 
      } 


     } catch 
0

Вы можете использовать SQL * Loader для загрузки данных, но вы должны сделать это из файла. Это может быть или не быть сложно в зависимости от того, сколько данных задействовано, хотя вы, вероятно, могли бы написать сценарий, который устанавливает последовательные файлы, содержащие ваши данные.

Для таблицы называется TEST, с колоннами TEST_ID и TEST_BLOB:

Control.dat: 

load data 
infile data.dat 
replace 
into table TEST 
Fields terminated by ',' 
(
    TEST_ID, 
    lob_file FILLER CHAR, 
    TEST_CLOB LOBFILE(lob_file) TERMINATED BY EOF 
) 

data.dat: 

1,c:\work\clob1_data.dat 
2,c:\work\clob2_data.dat 
etc... 

C:\Work>sqlldr USER/[email protected] control=control.txt 
sqlldr USER/[email protected] control=control.txt 
SQL*Loader: Release 10.2.0.1.0 - Production on Thu Sep 24 01:20:06 2009 
Copyright (c) 1982, 2005, Oracle. All rights reserved. 
Commit point reached - logical record count 2 

Эта конфигурация была получена из этого примера: Ask Tom

Смежные вопросы