Sintaxis

CREATE[ORREPLACE][DEFINER=  role ]PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_body

proc_parameter:
    [IN|OUT|INOUT] param_name typetype:
    Any valid MariaDB datatype

characteristic:
    LANGUAGESQL|[NOT]DETERMINISTIC| NOSQL
  |SQL SECURITY  DEFINER
  |COMMENT'string'

routine_body:
    Valid SQLprocedure statement

Descripción

Crea un procedimiento almacenado. De forma predeterminada, una rutina está asociada con la base de datos predeterminada. Para asociar la rutina explícitamente con una base de datos determinada, especifique el nombre como db_name.sp_name cuando la cree.

Cuando se invoca la rutina, se realiza un USE db_name implícito (y se deshace cuando termina la rutina). El hace que la rutina tenga la base de datos predeterminada dada mientras se ejecuta. Las declaraciones USE dentro de las rutinas almacenadas no están permitidas.

Cuando se ha creado un procedimiento almacenado, lo invoca mediante el CALL declaración (ver CALL).

Para ejecutar el CREATE PROCEDURE declaración, es necesario tener la CREATE ROUTINE privilegio. De forma predeterminada, MariaDB otorga automáticamente la ALTER ROUTINE y EXECUTE privilegios para el creador de rutina. Consulte también Privilegios de rutina almacenados.

los DEFINER y las cláusulas SQL SECURITY especifican el contexto de seguridad que se utilizará al verificar los privilegios de acceso en el momento de la ejecución de la rutina, como se describe más adelante.

Si el nombre de la rutina es el mismo que el nombre de una función SQL incorporada, debe usar un espacio entre el nombre y el siguiente paréntesis al definir la rutina, o se producirá un error de sintaxis. Esto también es true cuando invoca la rutina más tarde. Por esta razón, sugerimos que es mejor evitar reutilizar los nombres de funciones SQL existentes para sus propias rutinas almacenadas.

El modo SQL IGNORE_SPACE se aplica a las funciones integradas, no a las rutinas almacenadas. Siempre está permitido tener espacios después de un nombre de rutina, independientemente de si IGNORE_SPACE está habilitado.

La lista de parámetros entre paréntesis debe estar siempre presente. Si no hay parámetros, se debe usar una lista de parámetros vacía de (). Los nombres de los parámetros no distinguen entre mayúsculas y minúsculas.

Cada parámetro puede declararse para usar cualquier tipo de datos válido, excepto que COLLATE attribute No puede ser usado.

Para obtener identificadores válidos para usar como nombres de procedimientos, consulte Nombres de identificadores.

ENTRADA / SALIDA / ENTRADA

Cada parámetro es un IN parámetro por defecto. Para especificar lo contrario para un parámetro, use la palabra clave OUT o INOUT antes del nombre del parámetro.

Un IN El parámetro pasa un valor a un procedimiento. El procedimiento puede modificar el valor, pero la modificación no es visible para la persona que llama cuando regresa el procedimiento. Un OUT El parámetro devuelve un valor del procedimiento al llamador. Su valor inicial es NULL dentro del procedimiento y su valor es visible para la persona que llama cuando regresa el procedimiento. Un INOUT El parámetro es inicializado por la persona que llama, puede ser modificado por el procedimiento y cualquier cambio realizado por el procedimiento es visible para la persona que llama cuando el procedimiento regresa.

Para cada OUT o INOUT parámetro, pase una variable definida por el usuario en el CALL instrucción que invoca el procedimiento para que pueda obtener su valor cuando el procedimiento regrese. Si llama al procedimiento desde otro procedimiento almacenado o función, también puede pasar un parámetro de rutina o una variable de rutina local como un IN o INOUT parámetro.

DETERMINISTICO / NO DETERMINISTICO

DETERMINISTIC y NOT DETERMINISTIC se aplica solo a las funciones. Especificando DETERMINISTC o NON-DETERMINISTIC en los procedimientos no tiene ningún efecto. El valor predeterminado es NOT DETERMINISTIC. Las funciones son DETERMINISTIC cuando siempre devuelven el mismo valor para la misma entrada. Por ejemplo, una función truncada o subcadena. Cualquier función que involucre datos, por lo tanto, siempre es NOT DETERMINISTIC.

CONTIENE SQL / SIN SQL / LEE DATOS SQL / MODIFICA LOS DATOS SQL

CONTAINS SQL, NO SQL, READS SQL DATA, y MODIFIES SQL DATA son cláusulas informativas que le dicen al servidor qué hace la función. MariaDB no comprueba de ninguna manera si la cláusula especificada es correcta. Si no se especifica ninguna de estas cláusulas, CONTAINS SQL se utiliza de forma predeterminada.

MODIFIES SQL DATA significa que la función contiene declaraciones que pueden modificar datos almacenados en bases de datos. Esto sucede si la función contiene declaraciones como DELETE, UPDATE, INSERT, REPLACE o DDL.

READS SQL DATA significa que la función lee datos almacenados en bases de datos, pero no modifica ningún dato. Esto sucede si se utilizan sentencias SELECT, pero no se ejecutan operaciones de escritura.

CONTAINS SQL significa que la función contiene al menos una instrucción SQL, pero no lee ni escribe ningún dato almacenado en una base de datos. Los ejemplos incluyen SET o DO.

NO SQL no significa nada, porque MariaDB actualmente no es compatible con ningún otro idioma que no sea SQL.

El cuerpo_rutina consta de una sentencia de procedimiento SQL válida. Puede ser una declaración simple como SELECT o INSERT, o puede ser una declaración compuesta escrita usando BEGIN y END. Las declaraciones compuestas pueden contener declaraciones, bucles y otras declaraciones de estructura de control. Consulte Declaraciones programáticas y compuestas para obtener detalles sobre la sintaxis.

MariaDB permite que las rutinas contengan declaraciones DDL, como CREATE Y cae. MariaDB también permite que los procedimientos almacenados (pero no las funciones almacenadas) contengan declaraciones de transacciones SQL como COMMIT.

Para obtener información adicional sobre las declaraciones que no están permitidas en las rutinas almacenadas, consulte Limitaciones de las rutinas almacenadas.

Invocar el procedimiento almacenado desde dentro de los programas

Para obtener información sobre cómo invocar procedimientos almacenados desde programas escritos en un lenguaje que tiene una interfaz MariaDB / MySQL, consulte CALL.

O REEMPLAZAR

MariaDB comenzando con 10.1.3

Si el opcional OR REPLACE se utiliza la cláusula, actúa como un atajo para:

DROPPROCEDUREIFEXISTS name;CREATEPROCEDURE name ...;

con la excepción de que no se eliminan los privilegios existentes para el procedimiento.

sql_mode

MariaDB almacena la configuración de la variable de sistema sql_mode que está en vigor en el momento en que se crea una rutina, y siempre ejecuta la rutina con esta configuración en vigor, independientemente del modo SQL del servidor en vigor cuando se invoca la rutina.

Conjuntos de caracteres y colaciones

Los parámetros de procedimiento se pueden declarar con cualquier juego de caracteres / colación. Si el juego de caracteres y la colación no se establecen específicamente, se utilizarán los valores predeterminados de la base de datos en el momento de la creación. Si los valores predeterminados de la base de datos cambian en una etapa posterior, el conjunto de caracteres / colación del procedimiento almacenado no se cambiará al mismo tiempo; el procedimiento almacenado debe descartarse y volver a crearse para garantizar que se utilice el mismo conjunto de caracteres / clasificación que la base de datos.

Modo Oracle

MariaDB comenzando con 10.3

Desde MariaDB 10.3, se ha admitido un subconjunto del lenguaje PL / SQL de Oracle además de la sintaxis tradicional MariaDB basada en SQL / PSM. Consulte el modo Oracle de MariaDB 10.3 para obtener detalles sobre los cambios al ejecutar el modo Oracle.

Ejemplos de

El siguiente ejemplo muestra un procedimiento almacenado simple que usa un OUT parámetro. Utiliza el comando DELIMITER para establecer un nuevo delimitador durante la duración del proceso. consulte Delimitadores en el cliente mysql.

DELIMITER//CREATEPROCEDURE simpleproc (OUT param1 INT)BEGINSELECTCOUNT(*)INTO param1 FROM t;END;//DELIMITER;CALL simpleproc(@a);SELECT@a;+------+|@a|+------+|1|+------+

Conjunto de caracteres y colación:

DELIMITER//CREATEPROCEDURE simpleproc2 (OUT param1 CHAR(10)CHARACTERSET'utf8'COLLATE'utf8_bin')BEGINSELECT CONCAT('a'),f1 INTO param1 FROM t;END;//DELIMITER;

CREAR O REEMPLAZAR:

DELIMITER//CREATEPROCEDURE simpleproc2 (OUT param1 CHAR(10)CHARACTERSET'utf8'COLLATE'utf8_bin')BEGINSELECT CONCAT('a'),f1 INTO param1 FROM t;END;//
ERROR 1304(42000): PROCEDURE simpleproc2 already existsDELIMITER;DELIMITER//CREATEORREPLACEPROCEDURE simpleproc2 (OUT param1 CHAR(10)CHARACTERSET'utf8'COLLATE'utf8_bin')BEGINSELECT CONCAT('a'),f1 INTO param1 FROM t;END;//
ERROR 1304(42000): PROCEDURE simpleproc2 already existsDELIMITER;
Query OK,0rows affected (0.03 sec)

Ver también

  • Nombres de identificadores
  • Descripción general del procedimiento almacenado
  • MODIFICAR EL PROCEDIMIENTO
  • PROCEDIMIENTO DE GOTA
  • MOSTRAR CREAR PROCEDIMIENTO
  • MOSTRAR ESTADO DEL PROCEDIMIENTO
  • Privilegios de rutina almacenados
  • Tabla de RUTINAS del esquema de información

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.