CALL - Amazon Redshift

CALL

Ejecuta un procedimiento almacenado. El comando CALL debe incluir el nombre del procedimiento y los valores del argumento de entrada. Debe llamar a un procedimiento almacenado mediante la instrucción CALL.

nota

CALL no puede formar parte de ninguna consultar normal.

Sintaxis

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

Parámetros

sp_name

El nombre del procedimiento que debe ejecutarse.

argument

El valor del argumento de entrada. Este parámetro también puede ser un nombre de función; por ejemplo pg_last_query_id(). No es posible utilizar consultas como argumentos de CALL.

Notas de uso

Los procedimientos almacenados de Amazon Redshift admiten llamadas anidadas y recursivas, tal y como se describe a continuación. Además, asegúrese de que el soporte de los controladores está al día, también se describe a continuación.

Llamadas anidadas

Los procedimientos almacenados de Amazon Redshift admiten llamadas anidadas y recursivas. El número máximo de niveles de agrupación permitido es 16. Las llamadas agrupadas pueden encapsular la lógica empresarial en procedimientos más pequeños que pueden compartir varios remitentes.

Si llama a un procedimiento agrupado que tiene parámetros de salida, el procedimiento interior debe definir argumentos INOUT. En este caso, el procedimiento interior se pasa en una variable no constante. No se permiten argumentos OUT. Este comportamiento se produce porque se necesita una variable para retener la salida de la llamada interior.

La relación entre los procedimientos interior y exterior se registra en la columna from_sp_call de SVL_STORED_PROC_CALL.

El siguiente ejemplo muestra el paso de variable a una llamada de procedimientos agrupada a través de argumentos INOUT.

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)

Soporte de los controladores

Recomendamos actualizar los controladores Java Database Connectivity (JDBC) y Open Database Connectivity (ODBC) a la versión más reciente compatible con los procedimientos almacenados de Amazon Redshift.

Es posible que pueda utilizar el controlador existente si la herramienta de su cliente utiliza operaciones de la API del controlador que pasa a través de la instrucción CALL al servidor. Los parámetros de salida, si los hubiere, se devuelven como un conjunto de resultados de una fila.

Las versiones más recientes de los controladores de JDBC y ODBC de Amazon Redshift admiten los metadatos para el descubrimiento de procedimientos almacenados. También tienen soporte CallableStatement para aplicaciones Java personalizadas. Para obtener más información acerca de los controladores, consulte Conexión a un clúster de Amazon Redshift mediante herramientas de cliente SQL en la Guía de administración de Amazon Redshift.

Los siguientes ejemplos muestran cómo usar diferentes operaciones de la API del controlador JDBC para llamadas de procedimientos almacenadas.

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); }

Ejemplos

En el siguiente ejemplo, se llama al nombre del procedimiento test_spl.

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

En el siguiente ejemplo, se llama al nombre del procedimiento test_spl2.

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