Chris311
Chris311

Reputation: 3992

Informix: Modify from CLOB to LVARCHAR

I have a table

CREATE TABLE TEST
(
    test_column CLOB
)

I want to change the datatype of test_column to LVARCHAR. How can I achieve this? I tried several things until now:

This works, but the content of test_column gets converted from 'test' to '01000000d9c8b7a61400000017000000ae000000fb391956000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000'.

This does not work and I get the following exception: [Error Code: -674, SQL State: IX000] Method (substr) not found.

Do you have any further ideas?

Upvotes: 0

Views: 2293

Answers (1)

Luís Marques
Luís Marques

Reputation: 1451

Using a 12.10.xC5DE instance to do some tests.

From what i could find in the manuals, there isn't a cast from CLOB to other data types.

CLOB data type

No casts exist for CLOB data. Therefore, the database server cannot convert data of the CLOB type to any other data type, except by using these encryption and decryption functions to return a BLOB. Within SQL, you are limited to the equality ( = ) comparison operation for CLOB data. To perform additional operations, you must use one of the application programming interfaces from within your client application.

The encryption/decryption functions mentioned still return CLOB type objects, so they do not do what you want.

Despite the manual saying that there is no cast for CLOB, there is a registered cast in the SYSCASTS table. Using dbaccess , i tried an explicit cast on some test data and got return values similar to the ones you are seeing. The text in the CLOB column is 'teste 01', terminated with a line break.

CREATE TABLE myclob
(
    id SERIAL NOT NULL
  , doc CLOB
);
INSERT INTO myclob ( id , doc ) VALUES ( 0, FILETOCLOB('file1.txt', 'client'));

SELECT
    id
  , doc
  , doc::LVARCHAR AS conversion
FROM
    myclob;


id          1
doc
teste 01

conversion  01000000d9c8b7a6080000000800000007000000a6cdc0550000000001000000000
            0000000000000000000000000000000000000000000000000000000000000000000
            0000000000

So, there is a cast from CLOB, but it does not seem to be useful for what you want.

So back to the SQL Packages Extension . You need to register this datablade on the database. The files required are located in the $INFORMIXDIR/extend and you want the excompat.* module. Using the admin API, you can register the module by executing the following:

EXECUTE FUNCTION sysbldprepare('excompat.*', 'create');

If the return value is 0 (zero) then the module should now be registered.

SELECT
    id
  , DBMS_LOB_SUBSTR(doc, DBMS_LOB_GETLENGTH(doc) - 1, 1) as conversion
FROM
    myclob;

id          1
conversion  teste 01

Another way would be to register your own cast from CLOB to LVARCHAR, but you would have to code an UDR to implement it.

P.S:

Subtracting 1 from the CLOB length to remove the line break.

Upvotes: 2

Related Questions