Serie: Einführung in den Inhalt von cx_Oracle
Anonymes PL / SQL kann wie jede andere SQL-Anweisung mit der execute () -Methode des Cursor-Objekts ausgeführt werden. Unten ist ein Beispiel. Wie im Beispiel sind auch Bindungsvariablen verfügbar.
sample11a.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
begin
:out_value := :in_value * 2;
end;
"""
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
outValue = cursor.var(int)
cursor.execute(SQL, [outValue, 111])
print(outValue.getvalue())
Es gibt zwei Arten von Ausführungsmethoden zum Speichern gespeicherter Prozeduren.
sample11b.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
create or replace procedure sample11b(in_value in number, out_value out number) is
begin
out_value := in_value * 2;
end;
"""
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
outValue = cursor.var(int)
cursor.execute(SQL)
cursor.callproc("sample11b", [222, outValue])
print(outValue.getvalue())
Geben Sie, wie in der zweiten Zeile von unten gezeigt, den Namen der gespeicherten Prozedur an, die Sie im ersten Argument mit dem Typ str aufrufen möchten. Geben Sie für das zweite Argument das Argument für die gespeicherte Prozedur gemäß den Argumentspezifikationen der Prozedur an.
sample11c.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
create or replace procedure sample11b(in_value in number, out_value out number) is
begin
out_value := in_value * 2;
end;
"""
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
outValue = cursor.var(int)
cursor.execute(SQL)
cursor.execute("call sample11b(:a, :b)", [333, outValue])
print(outValue.getvalue())
Sie müssen die Prozedurargumente als Bindevariablen angeben.
Was besser ist, callproc () oder execute () + CALL. Im Fall von callproc () unterstützt die DB-API callproc () die Angabe des Arguments mit dem Argumentnamen nicht. Cx_Oracle erweitert jedoch die DB-API, um sie zu unterstützen. Wenn Sie genau der DB-API entsprechend codieren möchten, verwenden Sie execute () + CALL. Cx_Oracle verfügt jedoch über einige proprietäre Erweiterungen, über die die DB-API nicht verfügt. Daher scheint es schwierig zu sein, diese strikt einzuhalten. Im Gegenteil, ich denke, dass die Klarheit der Codierung callproc () ist. Außerdem scheinen sich die Spezifikationen für den Aufruf gespeicherter Prozeduren und gespeicherter Funktionen in der CALL-Anweisung im Vergleich zu callproc () geringfügig zu unterscheiden. Wenn Sie über diese Punkte besorgt sind, empfehlen wir die Verwendung von callproc ().
Es gibt zwei Arten von Ausführungsmethoden zum Speichern gespeicherter Prozeduren.
sample11d.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
create or replace function sample11d(in_value in number)
return number is
begin
return in_value * 2;
end;
"""
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
cursor.execute(SQL)
returnValue = cursor.callfunc("sample11d", int, [111])
print(returnValue)
Wie in der zweiten Zeile von unten gezeigt, gibt die Funktion das Operationsergebnis zurück, sodass es als Variable empfangen wird (returnValue im Beispielfall). Das erste Argument der Methode callfunc () ist der Funktionsname, der im Typ str übergeben werden muss. Die zweite gibt den Datentyp des Rückgabewerts der Funktion an. Das dritte ist das Funktionsargument.
sample11e.py
import cx_Oracle
USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
create or replace function sample11d(in_value in number)
return number is
begin
return in_value * 2;
end;
"""
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
with connection.cursor() as cursor:
outValue = cursor.var(int)
cursor.execute(SQL)
cursor.execute("call sample11d(:inValue) into :outValue", [222, outValue])
print(outValue.getvalue())
Dies entspricht im Wesentlichen der Ausführung einer gespeicherten Prozedur. Beachten Sie, dass für gespeicherte Funktionen eine INTO-Klausel erforderlich ist, um den Rückgabewert zu erhalten.
Welche der beiden oben genannten Ausführungsmethoden besser ist, entspricht im Grunde der Idee einer gespeicherten Funktion. Der Unterschied besteht darin, dass die DB-API kein callfunc () enthält.
Recommended Posts