40

I have an H2 database (http://www.h2database.com) and I'd like to insert a file into a BLOB field via a plain simple sql script (to populate a test database for instance). I know how to do that via the code but I cannot find how to do the sql script itself.

I tried to pass the path, i.e.

INSERT INTO mytable (id,name,file) VALUES(1,'file.xml',/my/local/path/file.xml);

but this fails.

Within the code (java for instance), it's easy to create a File object and pass that in, but directly from a sql script, I'm stuck ...

Any idea?

0

2 Answers 2

52

For testing, you can insert literal hex bytes or use the RAWTOHEX(string) function, as shown below.

create table a(id integer, item blob);
insert into a values(1,'54455354');
insert into a values(2, RAWTOHEX('Test'));
select UTF8TOSTRING(item) from a;
TEST
Test

Addendum: For loading BLOB fields from a file, FILE_READ(fileNameString) may be a useful alternative.

insert into a values(3, FILE_READ('file.dat'));
Sign up to request clarification or add additional context in comments.

7 Comments

looks like a very useful function for testing indeed! thanks for the hint
@David Michel: I overlooked the essence of your question; it looks like you want FILE_READ, added above.
I tried the FILE_READ() function which seems to work fine (no erros or warnings as the script runs) but then I get a 'java.lang.OutOfMemoryError: Java heap space' as I run a 'SELECT * FROM mytable'
I guess that could happen if the BLOBs are big enough. Have you tried -Xms and -Xmx? java.sun.com/javase/6/docs/technotes/tools/windows/java.html
The file is 11 MB which is not small, but not that big either. The fact that I'm running on a linux VM with VirtualBox so I have limited memory available.. which might explains this. I didn't that one could change the heap max size of the JVM via a command line option, thanks for the hint.
|
5

Not h2database, but may help; https://blog.jerrynixon.com/2009/03/tsql-to-insert-imageblog.html

Example code from the linked blog article, should the link break again:

CREATE TABLE MyTable 
    (id int, image varbinary(max))

INSERT INTO MyTable
    SELECT      1
        ,(SELECT * FROM OPENROWSET(
            BULK 'C:\file.bmp', SINGLE_BLOB) as x )

1 Comment

That look promising, I'll have a look a this, although this seems to be a TSQL specific...let's see

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.