Oracle adapter problem? How to fix this?

Hi,

My setup is:

Ruby 1.8.6
Rails 2.3.5
activerecord-oracle-adapter (1.0.0.9250)

I upgraded Rails and the adapter recently and I just went through hell
trying to find a problem while inserting a record in a table.

Rails was giving me this error:

OCIError (ORA-02289: sequence does not exist):
  stmt.c:539:in oci8lib.so
  c:/ruby/lib/ruby/site_ruby/1.8/oci8.rb:753:in `exec'
  c:/ruby/lib/ruby/site_ruby/1.8/oci8.rb:142:in `do_ocicall'
  c:/ruby/lib/ruby/site_ruby/1.8/oci8.rb:753:in `exec'
  c:/ruby/lib/ruby/site_ruby/1.8/oci8.rb:255:in `exec'
  c:/ruby/lib/ruby/gems/1.8/gems/activerecord-oracle-
adapter-1.0.0.9250/lib/active_record/connection_adapters/
oracle_adapter.rb:700:in `exec'
  c:/ruby/lib/ruby/gems/1.8/gems/activerecord-oracle-
adapter-1.0.0.9250/lib/active_record/connection_adapters/
oracle_adapter.rb:229:in `next_sequence_value'
  app/controllers/datafile_controller.rb:248:in `approval'

However what the real problem was is this:

ORA-01861 Literal Does Not Match Format String

As it turns out (and after lots of research and unless I am crazy
already) the problem seems to be in the INSERT statement that is
generated. Here goes an example (edited with just some date and
datetime values):

INSERT INTO (...) VALUES('2011-01-01', '2009-12-30 00:18:54',
'2010-06-30 00:00:00', '1995-01-01', '2009-12-30 00:18:54')

If I try to run manually the INSERT statement generated by Rails I get
the ORA-01861 error but if I run it editing the dates or datetime
values in format 'DD-MON-YY' (e.g.: '01-JAN-11'), as a post I found
suggested, the record is written to the table. BTW, in case it helps
all fields in the table that would receive a date or datetime value
are of type DATE.

Did I miss something obvious and it's just me not knowing how to set
the date/datetime values or is this a known problem?

Thank you.

Apologies if i'm missing the point, but you should always deal with
actual Time/Date/DateTime ruby objects and let rails handle the
translation into the format required by the database.

So, if you do something like

@foo = Foo.create(:time => Time.now)

rails will translate Time.now into the appropriate format.

Thanks Max,

I should have added a comment to my prior post. I do use ruby objects
to generate/calculate the Time/Date/DateTime values. The INSERT
statement I mentioned in the original message I retrieved it from the
development.log file. As far as I know that is the real INSERT
statement that runs against the Oracle DB and as you can see the
values that were generated are not what Oracle is expecting (DD-MON-
YY), if you trust that other post that helped me find the problem.

Ok, can you post up the rails code in question then?

Hi Max,

I did some more investigation and found that there is an alternative
to Oracle's adapter made by Raimonds Simanovskis. He calls it
'enhanced' adapter (http://blog.rayapps.com/2008/05/13/activerecord-
oracle-enhanced-adapter/). Just curious about it I read what it was
about and decided to give it a try.

Check out the differences in the INSERT statements that both adapters
generate for date values out of ruby objects (no code changes). Again,
this is out of development.log:

Oracle's: INSERT…'2011-01-01', …, '2011-01-01', …, '2009-12-30
12:01:26', …, '1995-01-01', …, '2009-12-30 12:01:26', …
enhanced's: INSERT…TO_DATE('2011-01-01 00:00:00','YYYY-MM-DD
HH24:MI:SS'), …, TO_DATE('2011-01-01 00:00:00','YYYY-MM-DD
HH24:MI:SS'), …, TO_DATE('2009-12-30 00:00:00','YYYY-MM-DD
HH24:MI:SS'), …, TO_DATE('1995-01-01 00:00:00','YYYY-MM-DD
HH24:MI:SS'), …, TO_DATE('2009-12-30 00:00:00','YYYY-MM-DD
HH24:MI:SS'), …

Since I changed the adapter I have had no problems.

Thanks for your help, though.

You should report this issue.

You’ll save someone’s life.

Good idea. I'll do it, although if I remember well what I read
Raimonds Simanovskis mentioned that he offered himself to Oracle to
maintain the adapter and they declined, not showing much interest in
enhancing it, which makes me believe not much will change,
unfortunately.

Original Oracle adapter is not maintained anymore since Rails 2.0 when
it was taken out of Rails core.

Therefore always please use oracle_enhanced adapter (http://github.com/
rsim/oracle-enhanced) which I maintain to be compatible with latest
Rails releases and which we use in many production applications.

Raimonds

Thanks Raimonds, you've been a life saver.