CREATE PROCEDURE sp_name ([parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION sp_name ([parameter[,...]]) [RETURNS type] [characteristic ...] routine_body parameter: [ IN | OUT | INOUT ] param_name type type: Any valid MySQL data type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | SQL SECURITY {DEFINER | INVOKER} | COMMENT string routine_body: Valid SQL procedure statement(s)
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 MySQL para suporte a UDFs (User Defined
Functions - Funções Definidas pelo Usuário). See
Secção 14.2, “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 MySQL 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()
com
sucesso.
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
MySQL, e pode ser usada para descrever o stored procedure.
Esta informação é exibida pelas instruções SHOW
CREATE PROCEDURE
e SHOW CREATE
FUNCTION
.
O MySQL 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
mysql
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 mysql
.
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:
mysql>delimiter |
mysql>CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
->RETURN CONCAT('Hello, ',s,'!');
->|
Query OK, 0 rows affected (0.00 sec) mysql>SELECT hello('world')|
+----------------+ | hello('world') | +----------------+ | Hello, world! | +----------------+ 1 row in set (0.00 sec)
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.