ActiveRecord and Oracle Views

Hi all, so I'm developing an app in Rails (first time, have been using Ruby a while), and I'm running into an issue with ActiveRecord. It doesn't seem to like Oracle views.

We have a large application where most stuff happens in Oracle stored procedures. But, for displaying and joining this data I was hoping to use ActiveRecord and Rails. When I try to simply say:

   class Environment < ActiveRecord::Base    end

I get:

    ORA-24372: invalid object for describe

I assume ActiveRecord is doing "describe environments" magic to create accessors/etc. (Note: I get this same error trying this from sqlplus as you can't describe views)

Has anyone tried this and/or had success/failure? I'd like to be able to use views with Rails (and ActiveRecord is not a requirement; just trying to understand everything).

Thanks, Nate

Nate,

I assume ActiveRecord is doing "describe environments" magic to create accessors/etc. (Note: I get this same error trying this from sqlplus as you can't describe views)

It may not be using the describe function. For example I can use sqlplus to describe a view that I created called venvironments. I don't have ActiveRecord setup so I didn't test that part. But Oracle describe seemed to work on a view.

Matt

Listing:

sqlplus blah/blah@blah

Connected to: Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.6.0 - Production

select object_name,object_type

  2 from all_objects   3 where object_name = 'VENVIRONMENTS';

OBJECT_NAME OBJECT_TYPE ------------------------------ ------------------ VENVIRONMENTS VIEW

desc venvironments

Name Null? Type ----------------------------------------- --------

In the code of oracle connection adaptor for active record it looks like views are intended to be supported. See the "when OCI_PTYPE_TABLE, OCI_PTYPE_VIEW" line.

--------- excerpt -----------     # Uses the describeAny OCI call to find the target owner and table_name     # indicated by +name+, parsing through synonynms as necessary. Returns     # an array of [owner, table_name].     def describe(name)       @desc ||= @@env.alloc(OCIDescribe)       @desc.attrSet(OCI_ATTR_DESC_PUBLIC, -1) if VERSION >= '0.1.14'       @desc.describeAny(@svc, name.to_s, OCI_PTYPE_UNK)       info = @desc.attrGet(OCI_ATTR_PARAM)

      case info.attrGet(OCI_ATTR_PTYPE)       when OCI_PTYPE_TABLE, OCI_PTYPE_VIEW         owner = info.attrGet(OCI_ATTR_OBJ_SCHEMA)         table_name = info.attrGet(OCI_ATTR_OBJ_NAME)         [owner, table_name]       when OCI_PTYPE_SYN         schema = info.attrGet(OCI_ATTR_SCHEMA_NAME)         name = info.attrGet(OCI_ATTR_NAME)         describe(schema + '.' + name)       end     end

Just so everyone knows the resolution, it turned out my view had become invalid because an underlying table had issues. The Oracle error was just confusing. I managed to get the *real* error by doing a "select * from environments". Once I corrected the view it works.