Gespeicherte Prozeduren und UDTFs: Argumentnamen in Aufrufen akzeptiert

Achtung

Diese Verhaltensänderung ist in Bundle 2023_03 enthalten.

Den aktuellen Status des Bundles finden Sie unter Bundle-Verlauf.

Bei Aufrufen von gespeicherten Prozeduren und benutzerdefinierten Tabellenfunktionen (UDTFs), bei denen der Aufruf benannte Argumente enthält, gibt Snowflake den Namen des Arguments Vorrang vor der Position des Arguments.

Bisher:

Bei Aufrufen von Prozeduren oder benutzerdefinierten Tabellenfunktionen (UDTFs), die benannte Argumente haben, ignoriert Snowflake die Argumentnamen und verwendet die Argumentposition, um zu bestimmen, welcher Wert an die Prozedur oder Funktion übergeben wird.

Jetzt:

Argumentnamen haben bei Aufrufen von Prozeduren und UDTFs Vorrang vor der Argumentposition. Dies kann zu folgendem Verhalten führen, das sich von dem Verhalten vor dieser Änderung unterscheidet:

  • Ein bisher funktionierender Aufruf einer gespeicherten Prozedur oder einer benutzerdefinierten Tabellenfunktion kann zu einem Fehler führen.

  • Argumentnamen können dazu führen, dass Argumente in einer anderen Reihenfolge als bisher übergeben werden. Dies kann zu einem Fehler, zu falschen Ergebnissen oder zu einer falschen Dateneinfügung führen.

  • Die Namen der Argumente können dazu führen, dass eine andere gespeicherte Prozedur mit demselben Namen aufgerufen wird. Dies kann zu einem Fehler, zu falschen Ergebnissen oder zu einer falschen Dateneinfügung führen.

  • Das folgende Beispiel veranschaulicht, wie sich die Aufrufe von zwei gespeicherten Prozeduren vor und nach der Änderung unterscheiden können.

Das folgende Beispiel veranschaulicht, wie sich die Aufrufe von zwei gespeicherten Prozeduren vor und nach der Änderung unterscheiden können.

-- One stored procedure
CREATE OR REPLACE PROCEDURE proc(STRARG1 varchar, STRARG2 varchar)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
  return 'hello';
END
$$;
-- Another procedure
CREATE OR REPLACE PROCEDURE proc(ARG1 number, ARG2 number)
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
BEGIN
  return ARG1 < ARG2;
END
$$;
-- Example A
-- Before: returns 'hello'
-- After: returns TRUE
CALL PROC(ARG1 => '5', ARG2 => '100');
-- Example B
-- Before: returns TRUE
-- After: returns 'hello'
CALL PROC(STRARG1 => 5, STRARG2 => 100); -- 'hello'.
Copy

Ref.: 1017