For the parts I'm working on right now, this is perfect. Thank you.

Matt

On Friday, September 21, 2012 5:19:17 PM UTC-5, Michael Bayer wrote:
>
>
> On Sep 21, 2012, at 3:49 PM, matt g wrote:
>
> Hi, 
> I'm working with a client that does most of their work in stored 
> procedures on an oracle database. One of the things I'm trying to help them 
> with is transitioning to use sqlalchemy for calling said procedures.
> For simple input and output types i was able to follow threads in this 
> group and do something like this:
>
> db.execute(text('begin HELLO_WORLD.say_hi(:x_in, :x_out); 
> end;',bindparams=[bindparam('x_in',String),outparam('x_out',String)]),x_in='matt').
>
> However, for most of their procedures, they actually have cursors in the 
> outparams. The only way i have found to do it is to drop down into using a 
> raw_connection and the cx_oracle types like so:
>
> engine = create_engine(dsn)
> con = engine.raw_connection()
> cur = conn.cursor()
> people=cur.var(cx_Oracle.CURSOR)
> groups=cur.var(cx_Oracle.CURSOR)
> params = [12345, people, groups]
> #12345 is a input param
> r = cur.callproc('list_people', params)
>
> Is there a way to keep this more abstract and within sqlalchemy instead of 
> dropping down into cx_Oracle?
>
>
> sure....the "out parameter" idea is pretty much an oracle-only thing these 
> days, so while we should be able to make this happen through the API, it 
> obviously isn't backend-agnostic.
>
> the usual "out parameter" routine is like you have above, where we get the 
> results back using the "out_parameters" member of the result:
>
> result = conn.execute(text('...', bindparams=[outparam('x', SomeType)]))
>
> result.out_parameters['x']
>
> this internally does what you're doing with cursor.var().  When you use 
> String, it knows to use cx_Oracle.STRING because the cx_oracle dialect 
> associates that DBAPI type with the String type.    At result time it 
> applies the String type to the result of Variable.getvalue().
>
> So, *assuming* the way cx_Oracle.CURSOR behaves here is that you get some 
> kind of special object via getvalue(), no changes to SQLAlchemy would be 
> needed.   If you need access to other methods of Variable (see 
> http://cx-oracle.sourceforge.net/html/variable.html) then we might have 
> to come up with something more involved, like intercepting the parameters 
> using after_cursor_execute() or something.
>
> To do this we just create a type:
>
> from sqlalchemy.types import TypeEngine
>
> class OracleCursorType(TypeEngine):
>     def get_dbapi_type(self, dbapi):
>         return dbapi.CURSOR
>
> If you use OracleCursorType in your outparam() function, you should get 
> the "cursor" value back in result.out_parameters.
>
> If you want to give me a SQL expression that will actually return a 
> "cursor" type, I can test this locally to iron out anything I'm missing, in 
> case this doesn't work as is.
>
>
>
>
>
>
>
>
>
> thanks,
> Matt 
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/sqlalchemy/-/u38qIICSt5AJ.
> To post to this group, send email to sqlal...@googlegroups.com<javascript:>
> .
> To unsubscribe from this group, send email to 
> sqlalchemy+...@googlegroups.com <javascript:>.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/EDfRZCZy0UIJ.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to