Link to home
Start Free TrialLog in
Avatar of Zolf
ZolfFlag for United Arab Emirates

asked on

PreparedStatement question

i get this error,my problem is with auto increment in oracle.
java.sql.SQLException: Invalid column index
      at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
      at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
      at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
      at oracle.jdbc.driver.OraclePreparedStatement.setBinaryStreamInternal(OraclePreparedStatement.java:8295)
      at oracle.jdbc.driver.OraclePreparedStatement.setBinaryStream(OraclePreparedStatement.java:8286)
      at src.com.victa.DBImage.dbInsertImage(DBImage.java:59)
      at src.com.victa.DBImage.main(DBImage.java:121)


PreparedStatement ps = connect.prepareStatement("insert into attachments (attach_id,file_name,file_path,file_type_id,data) values(attach_id_seq.nextval,?,?,?,?)");
                  File fileIn = new File("C:/Documents and Settings/My Documents/My Pictures/6804MPC.jpg");
                  int fileLength = (int)fileIn.length();
                  InputStream streamedJpg = new FileInputStream(fileIn);
                  //ps.setInt(1, attach_id.nextval);
                  ps.setString(2, "6804MPC.jpg");
                  ps.setString(3, "C:/Documents and Settings/zulf/My Documents/My Pictures/");
                  ps.setInt(4, 123);
                  ps.setBinaryStream(5,streamedJpg,fileLength);
                  ps.executeUpdate();

this is my table structure
create table attachments (
            attach_id number(10) primary key,
            file_name varchar2(50) not null,
            file_path varchar2(100),
            file_type_id number(10) not null,
            data blob,
            CONSTRAINT file_type_id_fk FOREIGN KEY (file_type_id) REFERENCES attach_file_types (attach_ft_id)
);
Avatar of CEHJ
CEHJ
Flag of United Kingdom of Great Britain and Northern Ireland image

Leave out the id from the statement
PreparedStatement ps = connect.prepareStatement("insert into attachments (file_name,file_path,file_type_id,data) values(attach_id_seq.nextval,?,?,?,?)");
Sorry typo:

PreparedStatement ps = connect.prepareStatement("insert into attachments (file_name,file_path,file_type_id,data) values(?,?,?,?)");
And you need to renumber the parameters
As I mentioned in your previous question, you don't need to specify an ootuoincrement filed in your insert.
the database looks after it for you.
Avatar of Zolf

ASKER


when i leave out the primary key it gives me error.this works fine with mysql,but not in case of oracle.please help

PreparedStatement ps = connect.prepareStatement("insert into attachments (file_name,file_path,file_type_id,data) values(?,?,?,?)");
                  File fileIn = new File("C:/Documents and Settings/zulf/My Documents/My Pictures/6804MPC.jpg");
                  int fileLength = (int)fileIn.length();
                  InputStream streamedJpg = new FileInputStream(fileIn);
                  //ps.setInt(1, attach_id.nextval);
                  ps.setString(1, "6804MPC.jpg");
                  ps.setString(2, "C:/Documents and Settings/zulf/My Documents/My Pictures/");
                  ps.setInt(3, 123);
                  ps.setBinaryStream(4,streamedJpg,fileLength);
                  ps.executeUpdate();

java.sql.SQLException: ORA-01400: cannot insert NULL into ("DSL"."ATTACHMENTS"."ATTACH_ID")

      at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
      at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
      at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
      at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
      at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:213)
      at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:952)
      at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1160)
      at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
      at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3368)
      at src.com.victa.DBImage.dbInsertImage(DBImage.java:59)
      at src.com.victa.DBImage.main(DBImage.java:120)
>                ps.setBinaryStream(5,streamedJpg,fileLength);

you're getting the error because there are only 4 placeholders defined in your statement
should be more like:

PreparedStatement ps = connect.prepareStatement("insert into attachments (attach_id,file_name,file_path,file_type_id,data) values(attach_id_seq.nextval,?,?,?,?)");
               File fileIn = new File("C:/Documents and Settings/My Documents/My Pictures/6804MPC.jpg");
               int fileLength = (int)fileIn.length();
               InputStream streamedJpg = new FileInputStream(fileIn);
               ps.setString(1, "6804MPC.jpg");
               ps.setString(2, "C:/Documents and Settings/zulf/My Documents/My Pictures/");
               ps.setInt(3, 123);
               ps.setBinaryStream(4,streamedJpg,fileLength);
you need to include the id for oracle, try the code I posted above
Avatar of Zolf

ASKER


i am sorry, typing error,it is like this

PreparedStatement ps = connect.prepareStatement("insert into attachments (file_name,file_path,file_type_id,data) values(?,?,?,?)");
                  File fileIn = new File("C:/Documents and Settings/zulf/My Documents/My Pictures/6804MPC.jpg");
                  int fileLength = (int)fileIn.length();
                  InputStream streamedJpg = new FileInputStream(fileIn);
                  //ps.setInt(1, attach_id.nextval);
                  ps.setString(1, "6804MPC.jpg");
                  ps.setString(2, "C:/Documents and Settings/zulf/My Documents/My Pictures/");
                  ps.setInt(3, 123);
                  ps.setBinaryStream(4,streamedJpg,fileLength);
                  ps.executeUpdate();
Avatar of Zolf

ASKER


When i run your code nothing happens,i mean data is not inserted in db nor do i get any error

PreparedStatement ps = connect.prepareStatement("insert into attachments (attach_id,file_name,file_path,file_type_id,data) values(attach_id_seq.nextval,?,?,?,?)");
            File fileIn = new File("C:/Documents and Settings/zulf/My Documents/My Pictures/6804MPC.jpg");
            int fileLength = (int)fileIn.length();
            InputStream streamedJpg = new FileInputStream(fileIn);
            ps.setString(1, "6804MPC.jpg");
            ps.setString(2, "C:/Documents and Settings/zulf/My Documents/My Pictures/");
            ps.setInt(3, 123);
            ps.setBinaryStream(4,streamedJpg,fileLength);
This should work, oracle shoudl autoincrement the field once you insert something in there. Are you still getting the same error?
u still need:

               ps.executeUpdate();

sorry, i just posted the bits that needed to be changed
YOu should leave out the auto increment field, as CEHJ suggested, oracle should do it for you.
PreparedStatement ps = connect.prepareStatement("insert into attachments (file_name,file_path,file_type_id,data) values(?,?,?,?)");
            File fileIn = new File("C:/Documents and Settings/zulf/My Documents/My Pictures/6804MPC.jpg");
            int fileLength = (int)fileIn.length();
            InputStream streamedJpg = new FileInputStream(fileIn);
            ps.setString(1, "6804MPC.jpg");
            ps.setString(2, "C:/Documents and Settings/zulf/My Documents/My Pictures/");
            ps.setInt(3, 123);
            ps.setBinaryStream(4,streamedJpg,fileLength);
ps.executeUpdate();

should work
Avatar of Zolf

ASKER


java.sql.SQLException: ORA-02291: integrity constraint (DSL.FILE_TYPE_ID_FK) violated - parent key not found

      at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
      at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
      at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
      at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
      at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:213)
      at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:952)
      at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1160)
      at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
      at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3368)
      at src.com.victa.DBImage.dbInsertImage(DBImage.java:69)
      at src.com.victa.DBImage.main(DBImage.java:132)
Avatar of Zolf

ASKER


i get the above error when i run objects code
Try to run my code
ASKER CERTIFIED SOLUTION
Avatar of Mick Barry
Mick Barry
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
> ORA-02291: integrity constraint (DSL.FILE_TYPE_ID_FK) violated

This means that you have inserted an inappropriate value in the file_type_id.
Avatar of Zolf

ASKER


girionis

java.sql.SQLException: ORA-01400: cannot insert NULL into ("DSL"."ATTACHMENTS"."ATTACH_ID")

      at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
      at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
      at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
      at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
      at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:213)
      at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:952)
      at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1160)
      at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
      at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3368)
      at src.com.victa.DBImage.dbInsertImage(DBImage.java:79)
      at src.com.victa.DBImage.main(DBImage.java:143)
Avatar of Zolf

ASKER


objects i did not understand what you meant.
Avatar of Zolf

ASKER


create table attach_file_types (
            attach_ft_id number(10) primary key,
            attach_ft_name varchar2(50) not null
);


create table attachments (
            attach_id number(10) primary key,
            file_name varchar2(50) not null,
            file_path varchar2(100),
            file_type_id number(10) not null,
            data blob,
            CONSTRAINT file_type_id_fk FOREIGN KEY (file_type_id) REFERENCES attach_file_types (attach_ft_id)
);


create sequence attach_ft_id_seq;
create sequence attach_id_seq;
The file_type_id_fk references the attach_ft_id field and it contains a value (file_type_id_fk) that does not exist in the attach_ft_id. Try to put a value in the third parameter that exists in the attach_ft_id.
In your table definition you define a contraint on the file_type_id that it must contain a matching value in the attach_file_types table. If you don't need this constraint then remove it from table definition.
Otherwise add a row to that table for the type you are using (3), or change the type to one that exists in that table.
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Zolf

ASKER


do you mean i need to add some data first into table attach_file_types before inserting into attachments.
Try this manually

INSERT INTO attach_file_types value(123, "a test field");
correct, you can only insert values in your image tanble with types that exist in other table
zolf,
> do you mean i need to add some data first into table attach_file_types
> before inserting into attachments.

yes

Sorry typo:

INSERT INTO attach_file_types VALUES(123, "a test field");
Avatar of Zolf

ASKER


you are geneuis,thanks mate.