2013-03-10 14 views
8

Z jakiegoś dziwnego powodu nie mogę uzyskać wyników z wywołania metody callproc w aplikacji testowej Python. Procedura przechowywana w MqSQL 5.2.47 wygląda następująco:Nie można zwrócić wyników z procedury przechowywanej przy użyciu kursora Python

Teraz, używając pycharm z Python 3.3, nie mogę nic zdają się odzyskać po wywołaniu tej procedury przechowywanej. Ten kod pobiera mi pożądanych rezultatów:

import mysql.connector 

cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') 
cnx._open_connection() 
cursor = cnx.cursor() 

cursor.execute("select * from person where person.person_id = 1") 
people = cursor.fetchall() 

for person in people: 
    print(person) 

cnx.close() 

ale ten kod albo cursor.fetchall() lub() cursor.fetchone ...

import mysql.connector 

cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') 
cnx._open_connection() 
cursor = cnx.cursor() 

cursor.callproc("getperson", [1]) 
people = cursor.fetchall() 

for person in people: 
    print(person) 

cnx.close() 

... zwraca „mysql.connector. errors.InterfaceError: Brak ustawionego wyniku pobierania. " Jest dodatkowy dziwne zachowanie przy użyciu metody cursor.execute() tak jak ...

import mysql.connector 

cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') 
cnx._open_connection() 
cursor = cnx.cursor() 

cursor.execute("call getperson(1)") 
people = cursor.fetchall() 

for person in people: 
    print(person) 

cnx.close() 

... bo to daje „mysql.connector.errors.InterfaceError Use cmd_query_iter do sprawozdania z wieloma zapytaniami”, a następnie "mysql.connector.errors.InterfaceError: Użyj multi = True podczas wykonywania wielu instrukcji" pomimo faktu, że zwracam tylko jeden wynik zapytania zamiast wielu zestawów wyników. Czy złącze MySQL Python traktuje wywołanie execute w procedurze przechowywanej jako podwójne zapytanie? Jak mogę po prostu wywołać procedurę przechowywaną i odzyskać wyniki? Naprawdę nie chcę dynamicznego SQL w moim kodzie. Z góry dziękuję za radę!

Odpowiedz

11

Czy próbowałeś wybierając jedną z wynikowych?

for result in cursor.stored_results(): 
    people = result.fetchall() 

mogłoby się okazać, że to alokacji dla wielu wynikowych, nawet jeśli tylko jeden SELECT stmt. Wiem, że w przechowywanych w PHP procedurach przechowywanych w MySQLi robimy to, aby umożliwić zwroty zmiennych INOUT i OUT (które znowu nie mają żadnego z nich, ale być może alokują).

Kompletny kod używam (które działa) to:

import mysql.connector 

cnx = mysql.connector.connect(user='me',password='pw',host='localhost',database='mydb') 
cnx._open_connection() 
cursor = cnx.cursor() 

cursor.callproc("getperson",[1]) 

for result in cursor.stored_results(): 
    people=result.fetchall() 

for person in people: 
    print person 

cnx.close() 
0

Dlaczego nie spróbować w ten sposób

cursor.callproc("getperson", ['1']) 
+0

nie byłoby to więcej niż składni SQL serwera MySQL? –

+0

Ponieważ nie jest to poprawne polecenie w PL/SQL MySQL. Jest to poprawne polecenie dla SQL-a T-SQL, ale to nie jest to, czego używam w tym projekcie. Składnia MySQL do wywoływania procedur przechowywanych to 'call proc_name ([arguments])'. – gfish3000

Powiązane problemy