CALL - Amazon Redshift

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

CALL

Führt eine gespeicherte Prozedur aus. Der CALL-Befehl muss den Namen der Prozedur und die Werte der Eingabeargumente enthalten. Zum Aufrufen einer gespeicherten Prozedur verwenden Sie die CALL-Anweisung.

Anmerkung

CALL kann nicht Teil einer regulären Abfrage sein.

Syntax

CALL sp_name ( [ argument ] [, ...] )

Parameter

sp_name

Der Name der Prozedur, die ausgeführt werden soll.

argument

Der Wert des Eingabearguments. Dieser Parameter kann auch ein Funktionsname sein, wie z. B. pg_last_query_id(). Abfragen können nicht als CALL-Argumente verwendet werden.

Nutzungshinweise

In Amazon Redshift gespeicherte Prozeduren unterstützen verschachtelte und rekursive Aufrufe wie im Nachfolgenden beschrieben. Stellen Sie außerdem sicher, dass Ihre Treiberunterstützung up-to-date, ebenfalls im Folgenden beschrieben, unterstützt wird.

Verschachtelte Aufrufe

In Amazon Redshift gespeicherte Prozeduren unterstützen verschachtelte und rekursive Aufrufe. Die zulässige Höchstanzahl an Verschachtelungsebenen beträgt 16. Verschachtelte Aufrufe können Geschäftslogik in kleineren Prozeduren verkapseln, die von mehreren Aufrufern geteilt werden können.

Wenn Sie eine verschachtelte Prozedur aufrufen, die über Ausgabeparameter verfügt, muss die innere Prozedur INOUT-Argumente definieren. In diesem Fall wird die innere Prozedur in einer nicht konstanten Variable übergeben. OUT-Argumente sind nicht zulässig. Dies ist darauf zurückzuführen, dass eine Variable zum Aufnehmen der Ausgabe des inneren Aufrufs erforderlich ist.

Die Beziehung zwischen inneren und äußeren Prozeduren wird in der Spalte from_sp_call von SVL_STORED_PROC_CALL protokolliert.

Das folgende Beispiel zeigt die Übergabe von Variablen an einen verschachtelten Prozeduraufruf über INOUT-Argumente.

CREATE OR REPLACE PROCEDURE inner_proc(INOUT a int, b int, INOUT c int) LANGUAGE plpgsql AS $$ BEGIN a := b * a; c := b * c; END; $$; CREATE OR REPLACE PROCEDURE outer_proc(multiplier int) LANGUAGE plpgsql AS $$ DECLARE x int := 3; y int := 4; BEGIN DROP TABLE IF EXISTS test_tbl; CREATE TEMP TABLE test_tbl(a int, b varchar(256)); CALL inner_proc(x, multiplier, y); insert into test_tbl values (x, y::varchar); END; $$; CALL outer_proc(5); SELECT * from test_tbl; a | b ----+---- 15 | 20 (1 row)

Treiberunterstützung

Wir empfehlen die Aktualisierung Ihrer Java Database Connectivity (JDBC)- und Open Database Connectivity (ODBC)-Treiber auf die neueste Version, die Unterstützung für in Amazon Redshift gespeicherte Prozeduren bietet.

Wenn Ihr Clienttool Treiber-API-Operationen verwendet, die die CALL-Anweisungen an den Server übergeben, können Sie unter Umständen Ihren vorhandenen Treiber verwenden. Ausgabeparameter werden (sofern vorhanden) als Ergebnissatz mit einer Zeile zurückgegeben.

Die neusten Versionen der Amazon Redshift JDBC- und ODBC-Treiber bieten Metadatenunterstützung für die Erkennung gespeicherter Prozeduren. Außerdem bieten sie CallableStatement-Unterstützung für individuelle Java-Anwendungen. Weitere Informationen zu Treibern finden Sie unter Herstellen von Verbindungen mit Amazon-Redshift-Clustern mithilfe von SQL-Client-Tools im Amazon-Redshift-Verwaltungshandbuch.

Die folgenden Beispiele zeigen, wie Sie unterschiedliche API-Operationen des JDBC-Treibers für Aufrufe gespeicherter Prozeduren verwenden können.

void statement_example(Connection conn) throws SQLException { statement.execute("CALL sp_statement_example(1)"); } void prepared_statement_example(Connection conn) throws SQLException { String sql = "CALL sp_prepared_statement_example(42, 84)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.execute(); } void callable_statement_example(Connection conn) throws SQLException { CallableStatement cstmt = conn.prepareCall("CALL sp_create_out_in(?,?)"); cstmt.registerOutParameter(1, java.sql.Types.INTEGER); cstmt.setInt(2, 42); cstmt.executeQuery(); Integer out_value = cstmt.getInt(1); }

Beispiele

Das folgende Beispiel ruft den Prozedurnamen auf test_spl.

call test_sp1(3,'book'); INFO: Table "tmp_tbl" does not exist and will be skipped INFO: min_val = 3, f2 = book

Das folgende Beispiel ruft den Prozedurnamen auf test_spl2.

call test_sp2(2,'2019'); f2 | column2 ---------------------+--------- 2019+2019+2019+2019 | 2 (1 row)