CREATE PROCEDURE
e CREATE FUNCTION
A cláusula RETURNS
pode ser especificada apenas por uma FUNCTION
. É usada para indicar o tipo de retorno da função, e o corpo da função deve conter uma instrução RETURN value
.
A lista de parâmetros entre parenteses deve estar sempre presente. Se não houver parâmetros, uma lista de parâmetros vazia de ()
deve ser usada. Cada parâmetro é um parâmetro IN
por padrão. Para especificar outro tipo de parâmetro, use a palavra chave OUT
ou INOUT
antes do nome do parâmetro. Especificar IN
, OUT
ou INOUT
só é valido para uma PROCEDURE
.
A instrução CREATE FUNCTION
é usada em versão novas do MariaDB para suporte a UDFs (User Defined Functions - Funções Definidas pelo Usuário). Leia "Adicionando Novas Funções ao MySQL". As UDFs continuam a ser suportadas, mesmo com a existencia de stored functions. Uma UDF pode ser considerada como uma stored function externa. No entanto, note que stored functions compartilham os seus namespace com as UDF
s.
Um framework para stored procedures externas serão introduzidas em um futuro próxima. Isto permitirá que você escreva stored procedures em outras linguagens além de SQL. Provavelmente, uma das primeiras linguagens a ser suportada sea PHP, já que o mecanismo do PHP é pequeno, seguro com threads e pode facilmente ser embutido. Como o framework será publico, é esperado que muitas outras linguagens também sejam suportadas.
Uma função é considerada deterministica
se ela sempre retorna o mesmo resultado para os mesmos parâmetros de entrada, e não deterministica
caso contrário. O otimizado pode usar este fato. Atualmente, a característica DETERMINISTIC
é aceita, mas ainda não é usada.
A característica SQL SECURITY
pode ser usada para especificar se a rotina deve ser executada usando as permissões do usuário que criou a rotina, ou o usuário que a chamou. O valor padrão é DEFINER
. Este recurso é novo no SQL:2003.
O MariaDB ainda não usa o privilégio GRANT EXECUTE
. Assim ,por enquanto, se um procedimento p1()
chama a tabela t1
,o usuário deve ter privilégios na tabela t1
para chamar o procedimento p1()
corretamente.
MySQL stores the SQL_MODE
settings in effect at the time a routine is created, and will always execute routines with these settings in force.
A cláusula COMMENT
é uma extensão do MariaDB, e pode ser usada para descrever o stored procedure. Esta informação é exibida pelas instruções SHOW CREATE PROCEDURE
e SHOW CREATE FUNCTION
.
O MariaDB permite rotinas contendo instruções DDL (como CREATE
e DROP
) e instruções de transação SQL (como COMMIT
). Isto não é exigido por padrão e depende de especificações de implementação.
NOTA: Atualmente, stored FUNCTION
s não podem conter referências às tabelas. Note que isto inclui algumas instruções SET
, mas exclui algumas instruções SELECT
. Esta limitação será retirada assim que possível.
A seguir temos um exemplo de uma stored procedure simples que usa um parâmetro OUT
. O exemplo usa o comando delimiter
do cliente MariaDB
para alterar o delimitador de instrução para antes da definição do procedure. Isto permite que o delimitador ';
' usado no corpo de procedure seja passado para o servidor em vez de ser interpretado pelo MariaDB
.
mysql>delimiter |
mysql>CREATE PROCEDURE simpleproc (OUT param1 INT)
->BEGIN
->SELECT COUNT(*) INTO param1 FROM t;
->END
->|
Query OK, 0 rows affected (0.00 sec) mysql>CALL simpleproc(@a)|
Query OK, 0 rows affected (0.00 sec) mysql>SELECT @a|
+------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec)
A seguir esta um exemplo de uma função que utiliza um parametro, realiza uma operação usando uma função SQL e retorna o resultado: