April 2017
« Sep    
Your widget title

Posts Tagged ‘SQL’

PostHeaderIcon How to export Oracle DB content to DBUnit XML flatfiles?


From an Agile and TDD viewpoint, performing uni tests on DAO is a requirement. Sometimes, instead of using DBUnit datasets “out of the box”, the developper need test on actual data. In the same vein, when a bug appears on production, isolating and reproducing the issue is a smart way to investigate, and, along the way, fix it.
Therefore, how to export actual data from Oracle DB (or even MySQL, Sybase, DB2, etc.) to a DBUnit dataset as a flat XML file?

Here is a Runtime Test I wrote on this subject:



Edit the following Spring context file, setting the login, password, etc.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""

    <!-- don't forget to write this, otherwise the application will miss the driver class name, and therfore the test will fail-->
    <bean id="driverClassForName" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass" value="java.lang.Class"/>
        <property name="targetMethod" value="forName"/>
        <property name="arguments">
    <bean id="connexion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
        <property name="targetClass" value="java.sql.DriverManager"/>
        <property name="targetMethod" value="getConnection"/>
        <property name="arguments">

    <bean id="databaseConnection" class="org.dbunit.database.DatabaseConnection">
        <constructor-arg ref="connexion"/>
    <bean id="queryDataSet" class="org.dbunit.database.QueryDataSet">
        <constructor-arg ref="databaseConnection"/>

The bean driverClassForName does not look to be used ; anyway, if Class.forName("oracle.jdbc.driver.OracleDriver") is not called, then the test will raise an exception.
To ensure driverClassForName is created before the bean connexion, I added a attribute depends-on="driverClassForName". The other beans will be created after connexion, since Spring will deduce the needed order of creation via the explicit dependency tree.


public class Oracle2DBUnitExtractor extends TestCase {
    private QueryDataSet queryDataSet;

    public void setUp() throws Exception {
        final ApplicationContext applicationContext;

        applicationContext = new ClassPathXmlApplicationContext(

        queryDataSet = (QueryDataSet) applicationContext.getBean("queryDataSet");


    public void testExportTablesInFile() throws DataSetException, IOException {
    // add all the needed tables ; take care to write them in the right order, so that you don't happen to fall on dependencies issues, such as ones related to foreign keys

        // Destination XML file into which data needs to be extracted
        FlatXmlDataSet.write(queryDataSet, new FileOutputStream("myProject/src/test/runtime/lalou/jonathan/output-dataset.xml"));


PostHeaderIcon How to populate/insert/update a CLOB larger than 4000 or 32767 bytes?

A Short String

I have a table of which one field is a CLOB. Let’s say I have to insert one record with a short text. The following command is allowed:

INSERT INTO jonathan_table VALUES (1, 'hello world!');

A Bigger Text

Error ORA-01704

Now, my text is larger, let’s say 5000 characters. When I launch the same query, I get the following error:

ORA-01704: string literal too long

Indeed, Oracle/SQL*Plus have a limit on CLOB inserts: 4000 bytes.


To pass through the limit on canonical SQL, you’ll have to use a PL/SQL procedure. The following command will be successful for any text larger than 4000 bytes, but shorter than 32767:

bigtext1   VARCHAR2 (32767);
bigtext1 := lpad('X', 32000, 'X')
INSERT INTO jonathan_table VALUES (1, bigtext1);

An Even Bigger Text

Errors ORA-06550 and PLS-00103

You guess it: beyond this limit of 32 KB, an error occurs. So the following script:

   bigtext1   VARCHAR2 (42000);
   bigtext1 := lpad('X', 42000, 'X')
   INSERT INTO jonathan_table
        VALUES (1, bigtext1);

raises such an error:

Error at line 1
ORA-06550: line 5, column 4:
PLS-00103: Encountered the symbol "INSERT" when expecting one of the following:

   . ( * % & = - + ; < / > at in is mod remainder not rem
   <an exponent (**)> <> or != or ~= >= <= <> and or like like2
   like4 likec between || multiset member submultiset
The symbol ";" was substituted for "INSERT" to continue.

Fix this issue

I searched a lot to find an easy fix to go beyond the limit of 32KB. My point was that with Java for instance there is no limit of 32KB. In the same way, with TOAD I was able to update the record with many mega bytes of text, via the clipboard. After further search, I learnt that the 32KB barrier was a SQL*Plus limitation on actual strings, but the patterns insert into ... select ... from were not affected.
Here is the idea:

  • create a temporary table
  • split the text into blocks shorter than 32KB
  • insert the blocks into the temporary table
  • perform a first insert with a null CLOB
  • update the record using a select on the temporary table (yet you can insert the actual value since previous step)

Here is an example:

DROP TABLE tt_jonathan_table;
    ID NUMBER(10),
    pdlsuffix CLOB

TRUNCATE TABLE tt_jonathan_table;

   bigtext1   VARCHAR2 (32767);
   bigtext2   VARCHAR2 (32767);
   bigtext1 := lpad('X', 32000, 'X')
   bigtext2 := lpad('Y', 32000, 'Y')
    INSERT INTO tt_jonathan_table
        VALUES (1, bigtext1);

   INSERT INTO tt_jonathan_table
        VALUES (2, bigtext2);

   INSERT INTO jonathan_table
               (id, myClobField)
        VALUES (jonathan_seq.NEXTVAL, NULL);

   UPDATE jonathan_table
      SET myClobField = (SELECT CONCAT (rls1.myClobField, rls2.myClobField)
                         FROM tt_jonathan_table rls1, tt_jonathan_table rls2
                        WHERE rls1.ID = 1 AND rls2.ID = 2)
    WHERE myClobField is null;

TRUNCATE TABLE tt_jonathan_table;

PostHeaderIcon How to Read a BLOB for a Human Being?


I have had to access a BLOB and read its content. By principle, I dislike using binary objects, which do not suit easy tracing and auditing. Anyway, in my case, floats are stored in a BLOB, and I need read them in order to validate my current development.

You have many ways to read the content of the BLOB. I used two: SQL and Java


Start your TOAD for Oracle ; you can launch queries similar to this:

SELECT UTL_RAW.cast_to_binary_float
             (DBMS_LOB.submyrecord (myrecord.myrecordess,
                                    1 + (myrecordessnameid * 4)
             ) AS myrecordessvalue
  FROM mytable myrecord
 WHERE myrecordessid = 123456; 

You can also run a stored procedure, similar to this:

   blobAsVariable  BLOB;
   my_vr           RAW (4);
   blobValue       FLOAT;
   bytelen         NUMBER  := 4;
   v_index         NUMBER  := 5;
   jonathan        RAW (4);
   loopLength      INT;
   SELECT myField
     INTO blobAsVariable
     FROM myTable
    WHERE tableid = (5646546846);

   DBMS_LOB.READ (blobAsVariable, bytelen, 1, jonathan);
   loopLength := UTL_RAW.cast_to_binary_integer (jonathan);

   FOR rec IN 1 .. loopLength
      DBMS_LOB.READ (blobAsVariable, bytelen, v_index, my_vr);
      blobValue := UTL_RAW.cast_to_binary_float (my_vr);
      v_index := v_index + 4;
      DBMS_OUTPUT.put_line (TO_CHAR (blobValue));


I am still not sure to be DBA expert. Indeed I am convinced I am more fluent in Java than in PL/SQL 😉

Create a Spring configuration file, let’s say BlobRuntimeTest-applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""
       xmlns:xsi="" xmlns:aop=""

    <!-- $Id: BlobRuntimeTest-applicationContext.xml  $ -->
    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@myDBserver:1234:MY_SCHEMA"/>
        <property name="username" value="jonathan"/>
        <property name="password" value="lalou"/>
        <property name="initialSize" value="2"/>
        <property name="minIdle" value="2"/>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>


Now create a runtime test:

 * User: Jonathan Lalou
 * Date: Aug 7, 2011
 * Time: 5:22:33 PM
 * $Id: $
public class BlobRuntimeTest extends TestCase {
    private static final Logger LOGGER = Logger.getLogger(BlobRuntimeTest.class);

    private static final String TABLE = "jonathanTable";
    private static final String PK_FIELD = "jonathanTablePK";
    private static final String BLOB_FIELD = "myBlobField";
    private static final int[] PK_VALUES = {123, 456, 789};

    private ApplicationContext applicationContext;
    private JdbcTemplate jdbcTemplate;

    public void setUp() throws Exception {
        applicationContext = new ClassPathXmlApplicationContext(
        jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");

    public void tearDown() throws Exception {

    public void testGetArray() throws Exception {
        for (int pk_value : PK_VALUES) {
            final Blob blob;
            final byte[] bytes;
            final float[] floats;

            blob = (Blob) jdbcTemplate.queryForObject("select " + BLOB_FIELD + " from " + TABLE + " where " + PK_FIELD + " = " + pk_value, Blob.class);
            bytes = blob.getBytes(1, (int) blob.length());
            // process your blob: unzip, read, concat, add, etc..
            // floats = ....

  "Blob size: "  + floats.length);

PostHeaderIcon SQL*Plus Does Not Update a Stored Procedure


You have a stored procedure that you would like to update. The script is OK with TOAD, but raises an error when launched via SQL*Plus.


Add a slash (‘/’) or a dot (‘.’) at the end of file.

PostHeaderIcon Cannot run this command because Java services are not enabled. A user with System Administrator (SA) role must reconfigure the system to enable Java.


An object is marshallized and sent on TibcoRV 8.1. An instance of Mule ESB 2.2.1 listens to TibcoRV, reads the message, unmarshalls the object and builds an SQL insert query.

The query is very simple:

insert into myTable(dateColumn, stringColumn) values(...)

It is executed in a Jdbc connector declared on Mule configuration file:

    <jdbc:connector name="jdbcConnector" dataSource-ref="mySybaseDB" pollingFrequency="1000">
        <jdbc:query key="writeTest"
                    value="INSERT INTO myTable(dateColumn, stringColumn)

The DB is Sybase. The first column is of type datetime, the second one is varchar. The values are retrieved from a java.util.Date and a java.lang.String.


When the query is run, I get the error:

java.sql.SQLException: Cannot run this command because Java services are not enabled. A user with System Administrator (SA) role must reconfigure the system to enable Java.

(you may get a com.sybase.jdbc2.jdbc.SybSQLException instead of java.sql.SQLException)

Explanation – Fix

The error is related only to Sybase, and not to TibcoRV and Mule: by default, Sybase cannot manage Java Dates (java.util.Date). You have to start explicitly the Java services. To perform that:

  • login with an username owing the rights “sa_role
  • run the SQL query:
    sp_configure 'enable java', 1
  • the restart the Sybase server

Now it should work. A similar error may occur with JBoss.