By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,853 Members | 1,012 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,853 IT Pros & Developers. It's quick & easy.

adodbapi and output parameters in stored procedures

P: n/a
Hello,

I need some help getting output values from my stored procedures when
using adodbapi. There's an example
testVariableReturningStoredProcedure in adodbapitest.py, and that
works for my system. But my stored procedure also inserts and
accesses a table in the database. Here's what I have it boiled down
to:

So, when I have
CREATE PROCEDURE sp_DeleteMeOnlyForTesting
@theInput varchar(50),
@theOtherInput varchar(50),
@theOutput varchar(100) OUTPUT
AS
SET @theOutput=@theInput+@theOtherInput

Then, I can run in python:
>>cursor = db.conn.cursor()
cursor.callproc('sp_DeleteMeOnlyForTesting', ('hello', 'bye', ''))
[u'hello', u'bye', u'hellobye']
If I redefined the procedure as
CREATE PROCEDURE sp_DeleteMeOnlyForTesting
@theInput varchar(50),
@theOtherInput varchar(50),
@theOutput varchar(100) OUTPUT
AS
SELECT * From dbo.testtable
SET @theOutput=@theInput+@theOtherInput

Then, the python comes out as :
>>cursor = db.conn.cursor()
cursor.callproc('sp_DeleteMeOnlyForTesting', ('hello', 'bye', ''))
[u'hello', u'bye', u'']

My search on the web found a couple of posts with similar problems,
but no solutions. I am using SQLOLEDB.1 as Provider, connecting to
SQL Server 2005.

Any help appreciated. I just need one method of passing an output
parameter back to python.

Thanks,
Li
Nov 7 '08 #1
Share this Question
Share on Google+
3 Replies


P: n/a
On 2008-11-07 15:04, le*******@yahoo.com wrote:
Hello,

I need some help getting output values from my stored procedures when
using adodbapi. There's an example
testVariableReturningStoredProcedure in adodbapitest.py, and that
works for my system. But my stored procedure also inserts and
accesses a table in the database. Here's what I have it boiled down
to:

So, when I have
CREATE PROCEDURE sp_DeleteMeOnlyForTesting
@theInput varchar(50),
@theOtherInput varchar(50),
@theOutput varchar(100) OUTPUT
AS
SET @theOutput=@theInput+@theOtherInput

Then, I can run in python:
>>>cursor = db.conn.cursor()
cursor.callproc('sp_DeleteMeOnlyForTesting', ('hello', 'bye', ''))
[u'hello', u'bye', u'hellobye']
If I redefined the procedure as
CREATE PROCEDURE sp_DeleteMeOnlyForTesting
@theInput varchar(50),
@theOtherInput varchar(50),
@theOutput varchar(100) OUTPUT
AS
SELECT * From dbo.testtable
SET @theOutput=@theInput+@theOtherInput

Then, the python comes out as :
>>>cursor = db.conn.cursor()
cursor.callproc('sp_DeleteMeOnlyForTesting', ('hello', 'bye', ''))
[u'hello', u'bye', u'']

My search on the web found a couple of posts with similar problems,
but no solutions. I am using SQLOLEDB.1 as Provider, connecting to
SQL Server 2005.

Any help appreciated. I just need one method of passing an output
parameter back to python.
Note that if you can, you should try to avoid output parameters
in stored procedures.

It's much more efficient to use multiple result sets for these,
so instead of doing

SELECT * From dbo.testtable
SET @theOutput=@theInput+@theOtherInput

you would write

SELECT * From dbo.testtable
SELECT @theInput+@theOtherInput

and then fetch the data using:

cursor.callproc(...)
test_table_result_set = cursor.fetchall()
cursor.nextset()
(output_variables,) = cursor.fetchone()

I don't know whether the above works for adodbapi. It does for mxODBC
and most other DB-API compatible modules that support .nextset().

--
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source (#1, Nov 07 2008)
>>Python/Zope Consulting and Support ... http://www.egenix.com/
mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/
mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
__________________________________________________ ______________________

:::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! ::::
eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48
D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
Registered at Amtsgericht Duesseldorf: HRB 46611
Nov 7 '08 #2

P: n/a
Thanks for that excellent pointer!

I was able to do just what you said with

But if my procedure has an insert statement in its midst, it doesn't
work. The cursor.fetchall() gets an exception.
Any ideas?

--Li
Nov 7 '08 #3

P: n/a

<le*******@yahoo.comwrote in message
news:b1**********************************@p35g2000 prm.googlegroups.com...
Hello,

I need some help getting output values from my stored procedures when
using adodbapi. There's an example
testVariableReturningStoredProcedure in adodbapitest.py, and that
works for my system. But my stored procedure also inserts and
accesses a table in the database. Here's what I have it boiled down
to:

So, when I have
CREATE PROCEDURE sp_DeleteMeOnlyForTesting
@theInput varchar(50),
@theOtherInput varchar(50),
@theOutput varchar(100) OUTPUT
AS
SET @theOutput=@theInput+@theOtherInput

Then, I can run in python:
>>>cursor = db.conn.cursor()
cursor.callproc('sp_DeleteMeOnlyForTesting', ('hello', 'bye', ''))
[u'hello', u'bye', u'hellobye']
If I redefined the procedure as
CREATE PROCEDURE sp_DeleteMeOnlyForTesting
@theInput varchar(50),
@theOtherInput varchar(50),
@theOutput varchar(100) OUTPUT
AS
SELECT * From dbo.testtable
SET @theOutput=@theInput+@theOtherInput

Then, the python comes out as :
>>>cursor = db.conn.cursor()
cursor.callproc('sp_DeleteMeOnlyForTesting', ('hello', 'bye', ''))
[u'hello', u'bye', u'']

My search on the web found a couple of posts with similar problems,
but no solutions. I am using SQLOLEDB.1 as Provider, connecting to
SQL Server 2005.

Any help appreciated. I just need one method of passing an output
parameter back to python.

Thanks,
Li
--
http://mail.python.org/mailman/listinfo/python-list
Output parameters aren't actually retrieved until you've iterated
thru all record sets. The below works using ADO objects
directly, not sure how it would translate into adodbapi.

import win32com.client

conn_str="Driver={SQL Server};Server=.\\SqlExpress;Trusted_Connection=ye s;"
sp_name="sp_DeleteMeOnlyForTesting"

c=win32com.client.gencache.EnsureDispatch('adodb.c onnection',0)
c.Open(conn_str)

cmd=win32com.client.Dispatch('ADODB.Command')
cmd.ActiveConnection=c
cmd.CommandType = win32com.client.constants.adCmdStoredProc
cmd.CommandText = sp_name

cmd.Parameters('@theInput').Value = 'bork'
cmd.Parameters('@theOtherInput').Value = 'borkbork'
rs, rc = cmd.Execute()
rs.NextRecordset()
print (cmd.Parameters('@theOutput').Value)

If the NextRecordset line is commented out, the output parm
is None.

Roger


Nov 7 '08 #4

This discussion thread is closed

Replies have been disabled for this discussion.