CALL - Amazon Redshift

CALL

Executa um procedimento armazenado. O comando CALL deve incluir o nome do procedimento e os valores do argumento de entrada. É obrigatório chamar um procedimento armazenado usando a instrução CALL.

nota

CALL não pode fazer parte de qualquer consulta regular.

Sintaxe

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

Parâmetros

sp_name

O nome do procedimento a ser executado.

argument

O valor do argumento de entrada. Esse parâmetro também pode ser um nome de função, por exemplo, pg_last_query_id(). Não é possível usar consultas como argumentos para CALL.

Observações de uso

Os procedimentos armazenados do Amazon Redshift oferecem suporte a chamadas aninhadas e recursivas, conforme descrito a seguir. Além disso, verifique se o seu suporte ao driver está atualizado, também descrito a seguir.

Chamadas aninhadas

Os procedimentos armazenados do Amazon Redshift oferecem suporte a chamadas aninhadas e recursivas. O número máximo de níveis de aninhamento permitido é 16. Chamadas aninhadas podem encapsular lógica de negócios em procedimentos menores, que podem ser compartilhados por vários chamadores.

Se você chamar um procedimento aninhado que tem parâmetros de saída, o procedimento interno deverá definir argumentos INOUT. Nesse caso, o procedimento interno será enviado em uma variável não constante. Argumentos OUT não são permitidos. Esse comportamento ocorre pois uma variável é necessária para conter a saída da chamada interna.

A relação entre os procedimentos interno e externo é registrada em log na coluna from_sp_call de SVL_STORED_PROC_CALL.

O exemplo a seguir mostra as variáveis enviadas a uma chamada de procedimento aninhado por meio 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)

Suporte a drivers

Recomendamos atualizar seus drivers de Java Database Connectivity (JDBC) e Open Database Connectivity (ODBC) para a versão mais recente com suporte para procedimentos armazenados do Amazon Redshift.

Você poderá usar o driver existente se a sua ferramenta de cliente usar operações da API de driver que transmitem a instrução CALL para o servidor. Parâmetros de saída, se houver, são retornados como um conjunto de resultados de uma linha.

As versões mais recentes dos drivers JDBC e ODBC do Amazon Redshift têm suporte a metadados para descoberta de procedimentos armazenados. Elas também têm suporte a CallableStatement para aplicativos Java personalizados. Para obter mais informações, consulte “Conectar-se a um cluster Amazon Redshift usando ferramentas de cliente SQL” no Guia de gerenciamento de clusters do Amazon Redshift.

Os exemplos a seguir mostram como usar diferentes operações da API do driver de JDBC para chamadas de procedimentos armazenados.

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

Exemplos

O exemplo a seguir chama o nome de procedimento test_spl.

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

O exemplo a seguir chama o nome de procedimento test_spl2.

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