{"id":15988,"date":"2024-07-29T14:51:52","date_gmt":"2024-07-29T11:21:52","guid":{"rendered":"https:\/\/www.itpiran.net\/blog\/?p=15988"},"modified":"2024-07-29T14:51:52","modified_gmt":"2024-07-29T11:21:52","slug":"how-to-use-stored-procedures-in-mysql","status":"publish","type":"post","link":"https:\/\/www.itpiran.net\/blog\/es\/tutorials\/how-to-use-stored-procedures-in-mysql\/","title":{"rendered":"C\u00f3mo usar procedimientos almacenados en MySQL"},"content":{"rendered":"<h2 id=\"%d9%85%d9%82%d8%af%d9%85%d9%87\">Introducci\u00f3n<\/h2>\n<p>Normalmente, al trabajar con una base de datos relacional, se utilizan instrucciones SQL (Structured Query Language) para recuperar o manipular datos, como SELECT, INSERT, UPDATE o DELETE, directamente desde el c\u00f3digo de la aplicaci\u00f3n. Estas instrucciones operan directamente sobre las tablas de la base de datos subyacente y las manipulan. Si las mismas instrucciones o un mismo conjunto de instrucciones se utilizan en varias aplicaciones que acceden a la misma base de datos, suelen repetirse en cada aplicaci\u00f3n.<\/p>\n<p>MySQL, al igual que muchos otros sistemas de gesti\u00f3n de bases de datos relacionales, admite el uso de procedimientos almacenados. Estos procedimientos permiten agrupar una o m\u00e1s instrucciones SQL para su reutilizaci\u00f3n bajo un nombre com\u00fan y encapsular la l\u00f3gica de negocio com\u00fan dentro de la propia base de datos. Un procedimiento de este tipo puede ser invocado desde una aplicaci\u00f3n que accede a la base de datos para recuperar o manipular datos de forma consistente.<\/p>\n<p>Mediante procedimientos almacenados, puede crear rutinas reutilizables para tareas comunes que se utilizar\u00e1n en m\u00faltiples aplicaciones, validar datos o proporcionar una capa adicional de seguridad de acceso a los datos al restringir el acceso directo de los usuarios de la base de datos a las tablas subyacentes y la realizaci\u00f3n de consultas arbitrarias.<\/p>\n<p>En este tutorial, aprender\u00e1 qu\u00e9 son los procedimientos almacenados y c\u00f3mo crear procedimientos almacenados b\u00e1sicos que devuelvan datos y utilicen par\u00e1metros de entrada y salida.<\/p>\n<h5 id=\"%d9%be%db%8c%d8%b4-%d9%86%db%8c%d8%a7%d8%b2%d9%87%d8%a7\">Requisitos previos<\/h5>\n<p>Para seguir esta gu\u00eda, necesita un ordenador con un sistema de gesti\u00f3n de bases de datos relacionales (SGBDR) basado en SQL. Las instrucciones y los ejemplos de esta gu\u00eda se han validado en el siguiente entorno:<\/p>\n<ul>\n<li>Un servidor con Ubuntu 20.04, con un usuario sin privilegios de administrador pero con privilegios administrativos y un cortafuegos configurado con UFW.<\/li>\n<li>MySQL est\u00e1 instalado y protegido en el servidor.<\/li>\n<li>Introducci\u00f3n b\u00e1sica a la ejecuci\u00f3n de consultas SELECT para recuperar datos de la base de datos.<\/li>\n<\/ul>\n<p><span style=\"color: #ff0000;\">Nota: Tenga en cuenta que muchos sistemas de gesti\u00f3n de bases de datos relacionales (SGBDR) utilizan su propia implementaci\u00f3n de SQL y la sintaxis de los procedimientos almacenados no forma parte del est\u00e1ndar SQL oficial. Si bien los comandos mencionados en este tutorial pueden funcionar en otros SGBDR, los procedimientos almacenados son espec\u00edficos de cada base de datos y, por lo tanto, la sintaxis o el resultado exactos pueden variar si los prueba en un sistema distinto a MySQL.<\/span><\/p>\n<p>Tambi\u00e9n necesitar\u00e1 una base de datos vac\u00eda en la que pueda crear tablas mediante procedimientos almacenados. Le recomendamos consultar la secci\u00f3n \u00abConexi\u00f3n a MySQL y configuraci\u00f3n de una base de datos de ejemplo\u00bb que aparece a continuaci\u00f3n para obtener m\u00e1s informaci\u00f3n sobre c\u00f3mo conectarse a un servidor MySQL y crear la base de datos de prueba utilizada en los ejemplos de esta gu\u00eda.<\/p>\n<h2 id=\"%d8%a7%d8%aa%d8%b5%d8%a7%d9%84-%d8%a8%d9%87-mysql-%d9%88-%d8%b1%d8%a7%d9%87-%d8%a7%d9%86%d8%af%d8%a7%d8%b2%db%8c-%db%8c%da%a9-%d9%be%d8%a7%db%8c%da%af%d8%a7%d9%87-%d8%af%d8%a7%d8%af%d9%87-%d9%86%d9%85\">Conexi\u00f3n a MySQL y configuraci\u00f3n de una base de datos de ejemplo<\/h2>\n<p>En esta secci\u00f3n, se conectar\u00e1 al servidor MySQL y crear\u00e1 una base de datos de ejemplo para que pueda utilizar los ejemplos de esta gu\u00eda.<\/p>\n<p>Para esta gu\u00eda, utilizar\u00e1s una colecci\u00f3n de coches ficticia. Almacenar\u00e1s informaci\u00f3n sobre los coches que posees actualmente, incluyendo su marca, modelo, a\u00f1o de fabricaci\u00f3n y valor.<\/p>\n<p>Si su sistema de base de datos SQL se ejecuta en un servidor remoto, con\u00e9ctese a su servidor mediante SSH desde su m\u00e1quina local:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>ssh sammy@your_server_ip\r\n<\/code><\/pre>\n<\/div>\n<p>A continuaci\u00f3n, abre la consola del servidor MySQL y sustituye Sami por tu nombre de usuario de MySQL:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>mysql -u sammy -p\r\n<\/code><\/pre>\n<\/div>\n<p>Crea una base de datos llamada procedimientos:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>CREATE DATABASE procedures;\r\n<\/code><\/pre>\n<\/div>\n<p>Si la base de datos se cre\u00f3 correctamente, recibir\u00e1 el siguiente resultado:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nQuery OK, 1 row affected (0.01 sec)<\/code><\/pre>\n<\/div>\n<p>Para seleccionar la base de datos de procedimientos, ejecute la siguiente instrucci\u00f3n USE:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>USE procedures;\r\n<\/code><\/pre>\n<\/div>\n<p>Obtendr\u00e1s el siguiente resultado:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nDatabase changed<\/code><\/pre>\n<\/div>\n<p>Una vez seleccionada una base de datos, puede crear tablas de instancias dentro de ella. La tabla \u00abm\u00e1quinas\u00bb contendr\u00e1 datos simplificados sobre las m\u00e1quinas de la base de datos. Contiene las siguientes columnas:<\/p>\n<ul>\n<li>Marca: Esta columna representa cada autom\u00f3vil que posee, expresado mediante el tipo de datos varchar con un m\u00e1ximo de 100 caracteres.<\/li>\n<li>Modelo: Esta columna contiene el nombre del modelo del coche, expresado mediante el tipo de datos varchar con un m\u00e1ximo de 100 caracteres.<\/li>\n<li>a\u00f1o: Esta columna almacena el a\u00f1o de fabricaci\u00f3n del autom\u00f3vil con un tipo de datos int para almacenar valores num\u00e9ricos.<\/li>\n<li>Valor: Esta columna almacena el valor del coche utilizando el tipo de datos decimal con un m\u00e1ximo de 10 d\u00edgitos y 2 d\u00edgitos despu\u00e9s del punto decimal.<\/li>\n<\/ul>\n<p>Crea la tabla de ejemplo con el siguiente comando:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>CREATE TABLE cars (\r\nmake varchar(100),\r\nmodel varchar(100),\r\nyear int,\r\nvalue decimal(10, 2)\r\n);<\/code><\/pre>\n<\/div>\n<p>Si se imprime el siguiente resultado, la tabla se ha creado correctamente:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nQuery OK, 0 rows affected (0.00 sec)<\/code><\/pre>\n<\/div>\n<p>A continuaci\u00f3n, cargue la tabla Cars con datos de muestra ejecutando la siguiente operaci\u00f3n INSERT INTO:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>INSERT INTO cars\r\nVALUES\r\n('Porsche', '911 GT3', 2020, 169700),\r\n('Porsche', 'Cayman GT4', 2018, 118000),\r\n('Porsche', 'Panamera', 2022, 113200),\r\n('Porsche', 'Macan', 2019, 27400),\r\n('Porsche', '718 Boxster', 2017, 48880),\r\n('Ferrari', '488 GTB', 2015, 254750),\r\n('Ferrari', 'F8 Tributo', 2019, 375000),\r\n('Ferrari', 'SF90 Stradale', 2020, 627000),\r\n('Ferrari', '812 Superfast', 2017, 335300),\r\n('Ferrari', 'GTC4Lusso', 2016, 268000);<\/code><\/pre>\n<\/div>\n<p>La operaci\u00f3n INSERT INTO a\u00f1ade diez coches deportivos de muestra a la tabla, cinco modelos Porsche y cinco modelos Ferrari. El siguiente resultado muestra que se han a\u00f1adido las cinco filas:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nQuery OK, 10 rows affected (0.00 sec)\r\nRecords: 10 Duplicates: 0 Warnings: 0<\/code><\/pre>\n<\/div>\n<p>Con esto, ya puedes seguir el resto de la gu\u00eda y empezar a usar procedimientos almacenados en SQL.<\/p>\n<h2 id=\"%d9%85%d9%82%d8%af%d9%85%d9%87-%d8%a7%db%8c-%d8%a8%d8%b1-%d8%b1%d9%88%db%8c%d9%87-%d9%87%d8%a7%db%8c-%d8%b0%d8%ae%db%8c%d8%b1%d9%87-%d8%b4%d8%af%d9%87\">Introducci\u00f3n a los procedimientos almacenados<\/h2>\n<p>En MySQL y muchos otros sistemas de bases de datos relacionales, los procedimientos almacenados se denominan objetos y contienen una o m\u00e1s instrucciones que se ejecutan secuencialmente cuando la base de datos los invoca. En el ejemplo m\u00e1s b\u00e1sico, un procedimiento almacenado puede guardar una expresi\u00f3n com\u00fan en una rutina reutilizable, como la recuperaci\u00f3n de datos de una base de datos mediante filtros de uso frecuente. Por ejemplo, se puede crear un procedimiento almacenado para recuperar los clientes de una tienda en l\u00ednea que hayan realizado pedidos en los \u00faltimos meses. En los escenarios m\u00e1s complejos, los procedimientos almacenados pueden representar programas extensos que describen la l\u00f3gica de negocio compleja para aplicaciones potentes.<\/p>\n<p>El conjunto de instrucciones de un procedimiento almacenado puede incluir instrucciones SQL comunes, como consultas SELECT o INSERT, que devuelven o manipulan datos. Adem\u00e1s, los procedimientos almacenados pueden utilizar lo siguiente:<\/p>\n<ul>\n<li>Los par\u00e1metros se pasan al procedimiento almacenado o se devuelven desde \u00e9l.<\/li>\n<li>Variables declaradas para procesar los datos recuperados directamente en el c\u00f3digo del procedimiento.<\/li>\n<li>Las sentencias condicionales permiten que se ejecuten secciones del c\u00f3digo de un procedimiento almacenado dependiendo de ciertas condiciones, como las sentencias IF o CASE.<\/li>\n<li>Los bucles como WHILE, LOOP y REPEAT permiten que secciones de c\u00f3digo se ejecuten varias veces, por ejemplo, para cada fila de un conjunto de datos recuperado.<\/li>\n<li>Instrucciones para el manejo de errores, como por ejemplo, devolver mensajes de error a los usuarios de la base de datos que tienen acceso al procedimiento.<\/li>\n<li>Llamar a otros procedimientos almacenados en la base de datos.<\/li>\n<\/ul>\n<p><span style=\"color: #ff0000;\">Nota: La amplia sintaxis que admite MySQL permite escribir programas potentes y resolver problemas complejos con procedimientos almacenados. Esta gu\u00eda solo cubre el uso b\u00e1sico de los procedimientos almacenados con instrucciones SQL incluidas en el cuerpo del procedimiento, as\u00ed como los par\u00e1metros de entrada y salida. La ejecuci\u00f3n de c\u00f3digo condicional, el uso de variables, los bucles y el manejo de errores personalizado no se tratan en esta gu\u00eda. Le recomendamos consultar la documentaci\u00f3n oficial de MySQL para obtener m\u00e1s informaci\u00f3n sobre los procedimientos almacenados.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>Cuando se llama al procedimiento por su nombre, el motor de la base de datos lo ejecuta tal como est\u00e1 definido, instrucci\u00f3n por instrucci\u00f3n.<\/p>\n<p>El usuario de la base de datos debe tener los permisos adecuados para ejecutar el procedimiento indicado. Este requisito de permisos proporciona una capa de seguridad, impidiendo el acceso directo a la base de datos, pero permitiendo a los usuarios acceder a procedimientos individuales que se pueden ejecutar de forma segura.<\/p>\n<p>Los procedimientos almacenados se ejecutan directamente en el servidor de la base de datos, realizando todos los c\u00e1lculos localmente y devolviendo los resultados al usuario que los invoc\u00f3 solo una vez finalizados.<\/p>\n<p>Si desea modificar el comportamiento de un procedimiento, puede actualizarlo en la base de datos y las aplicaciones que lo utilizan recibir\u00e1n autom\u00e1ticamente la nueva versi\u00f3n. Todos los usuarios comenzar\u00e1n a usar el nuevo c\u00f3digo del procedimiento de inmediato, sin necesidad de ajustar sus aplicaciones.<\/p>\n<p>Esta es la estructura general del c\u00f3digo SQL utilizado para crear un procedimiento almacenado:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>DELIMITER \/\/\r\nCREATE PROCEDURE procedure_name(parameter_1, parameter_2, . . ., parameter_n)\r\nBEGIN\r\ninstruction_1;\r\ninstruction_2;\r\n. . .\r\ninstruction_n;\r\nEND \/\/\r\nDELIMITER ;<\/code><\/pre>\n<\/div>\n<p>Las instrucciones inicial y final de este fragmento de c\u00f3digo son DELIMITER \/\/ y DELIMITER ;. MySQL suele usar el punto y coma (;) para delimitar las sentencias e indicar su inicio y fin. Si se ejecutan varios comandos en la consola de MySQL, separados por punto y coma, se tratan como comandos independientes y se ejecutan uno tras otro. Sin embargo, un procedimiento almacenado puede contener varios comandos que se ejecutan secuencialmente al ser invocados. Esto provoca un problema al intentar crear un nuevo procedimiento en MySQL. El motor de la base de datos encuentra el punto y coma en el cuerpo del procedimiento almacenado y cree que debe detener la ejecuci\u00f3n del comando. En este caso, el comando en cuesti\u00f3n es el c\u00f3digo completo de creaci\u00f3n del procedimiento, no una instrucci\u00f3n individual dentro del procedimiento, por lo que MySQL interpreta err\u00f3neamente la intenci\u00f3n.<\/p>\n<p>Para superar esta limitaci\u00f3n, utilice la instrucci\u00f3n DELIMITER para cambiar temporalmente el delimitador de ; a \/\/ durante la ejecuci\u00f3n de la llamada a CREATE PROCEDURE. A continuaci\u00f3n, todos los puntos y comas dentro del cuerpo del procedimiento almacenado se env\u00edan al servidor tal cual. Una vez finalizado el procedimiento, el delimitador vuelve a ser ; con el \u00faltimo DELIMITER ;.<\/p>\n<p>La parte central del c\u00f3digo para crear un nuevo procedimiento es la llamada a `CREATE PROCEDURE`, seguida del nombre del procedimiento: `procedure_name` en el ejemplo. A continuaci\u00f3n, se incluye una lista opcional de par\u00e1metros que el procedimiento acepta. Finalmente, se encuentra el cuerpo del procedimiento, delimitado por las instrucciones `BEGIN` y `END`. Dentro del c\u00f3digo del procedimiento se puede incluir una instrucci\u00f3n SQL, como una consulta `SELECT`, o c\u00f3digo m\u00e1s complejo.<\/p>\n<p>El comando END termina con \/\/, un separador temporal, en lugar de un punto y coma regular.<\/p>\n<p>En la siguiente secci\u00f3n, crear\u00e1 un procedimiento almacenado b\u00e1sico sin par\u00e1metros que encapsula una consulta.<\/p>\n<h2 id=\"%d8%a7%db%8c%d8%ac%d8%a7%d8%af-%db%8c%da%a9-%d8%b1%d9%88%db%8c%d9%87-%d8%b0%d8%ae%db%8c%d8%b1%d9%87-%d8%b4%d8%af%d9%87-%d8%a8%d8%af%d9%88%d9%86-%d9%be%d8%a7%d8%b1%d8%a7%d9%85%d8%aa%d8%b1\">Creaci\u00f3n de un procedimiento almacenado sin par\u00e1metros<\/h2>\n<p>En esta secci\u00f3n, crear\u00e1 su primer procedimiento almacenado que contiene una instrucci\u00f3n SQL SELECT para devolver una lista de autom\u00f3viles propiedad de un propietario, ordenados por marca y su valor en orden descendente.<\/p>\n<p>Comience ejecutando la instrucci\u00f3n SELECT que desea utilizar:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>SELECT * FROM cars ORDER BY make, value DESC;\r\n<\/code><\/pre>\n<\/div>\n<p>La base de datos devuelve una lista de coches de la tabla Coches, primero por marca y luego, dentro de cada marca, por valor en orden descendente:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\n+---------+---------------+------+-----------+\r\n| make | model | year | value |\r\n+---------+---------------+------+-----------+\r\n| Ferrari | SF90 Stradale | 2020 | 627000.00 |\r\n| Ferrari | F8 Tributo | 2019 | 375000.00 |\r\n| Ferrari | 812 Superfast | 2017 | 335300.00 |\r\n| Ferrari | GTC4Lusso | 2016 | 268000.00 |\r\n| Ferrari | 488 GTB | 2015 | 254750.00 |\r\n| Porsche | 911 GT3 | 2020 | 169700.00 |\r\n| Porsche | Cayman GT4 | 2018 | 118000.00 |\r\n| Porsche | Panamera | 2022 | 113200.00 |\r\n| Porsche | 718 Boxster | 2017 | 48880.00 |\r\n| Porsche | Macan | 2019 | 27400.00 |\r\n+---------+---------------+------+-----------+\r\n10 rows in set (0.00 sec)<\/code><\/pre>\n<\/div>\n<p>El Ferrari m\u00e1s valioso se encuentra en la parte superior de la lista, y el Porsche menos valioso en la parte inferior.<\/p>\n<p>Supongamos que esta consulta se usa repetidamente en varias aplicaciones o por varios usuarios, y que desea asegurarse de que todos usen el mismo m\u00e9todo para ordenar los resultados. Para ello, desea crear un procedimiento almacenado que almacene esa expresi\u00f3n en un procedimiento con nombre reutilizable.<\/p>\n<p>Para crear este procedimiento almacenado, ejecute el siguiente fragmento de c\u00f3digo:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>DELIMITER \/\/\r\nCREATE PROCEDURE get_all_cars()\r\nBEGIN\r\nSELECT * FROM cars ORDER BY make, value DESC;\r\nEND \/\/\r\nDELIMITER ;<\/code><\/pre>\n<\/div>\n<p>Como se explic\u00f3 en la secci\u00f3n anterior, las primeras y \u00faltimas instrucciones (DELIMITER \/\/ y DELIMITER \ud83d\ude09) le indican a MySQL que ignore el car\u00e1cter punto y coma como separador de instrucciones durante la creaci\u00f3n del procedimiento.<\/p>\n<p>La instrucci\u00f3n SQL CREATE PROCEDURE va seguida del nombre del procedimiento get_all_cars, que puede definirse para describir mejor su funci\u00f3n. Tras el nombre del procedimiento, hay un par de par\u00e9ntesis () donde se pueden a\u00f1adir par\u00e1metros. En este ejemplo, el procedimiento no utiliza par\u00e1metros, por lo que los par\u00e9ntesis est\u00e1n vac\u00edos. A continuaci\u00f3n, entre las instrucciones BEGIN y END, que definen el inicio y el final del bloque de c\u00f3digo del procedimiento, se escribe la instrucci\u00f3n SELECT utilizada anteriormente tal cual.<\/p>\n<p>La base de datos responder\u00e1 con un mensaje de \u00e9xito:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nQuery OK, 0 rows affected (0.02 sec)<\/code><\/pre>\n<\/div>\n<p>El procedimiento get_all_cars ahora est\u00e1 almacenado en la base de datos y, cuando se le llama, ejecuta la instrucci\u00f3n almacenada tal cual.<\/p>\n<p>Para ejecutar un procedimiento almacenado, puede usar el comando SQL CALL seguido del nombre del procedimiento. Intente ejecutar el procedimiento reci\u00e9n creado de la siguiente manera:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>CALL get_all_cars;\r\n<\/code><\/pre>\n<\/div>\n<p>El nombre del procedimiento, get_all_cars, es todo lo que necesita para usarlo. Ya no necesita escribir manualmente ninguna parte de la instrucci\u00f3n SELECT que usaba antes. La base de datos ejecuta los resultados tal como salen de la instrucci\u00f3n SELECT:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\n+---------+---------------+------+-----------+\r\n| make | model | year | value |\r\n+---------+---------------+------+-----------+\r\n| Ferrari | SF90 Stradale | 2020 | 627000.00 |\r\n| Ferrari | F8 Tributo | 2019 | 375000.00 |\r\n| Ferrari | 812 Superfast | 2017 | 335300.00 |\r\n| Ferrari | GTC4Lusso | 2016 | 268000.00 |\r\n| Ferrari | 488 GTB | 2015 | 254750.00 |\r\n| Porsche | 911 GT3 | 2020 | 169700.00 |\r\n| Porsche | Cayman GT4 | 2018 | 118000.00 |\r\n| Porsche | Panamera | 2022 | 113200.00 |\r\n| Porsche | 718 Boxster | 2017 | 48880.00 |\r\n| Porsche | Macan | 2019 | 27400.00 |\r\n+---------+---------------+------+-----------+\r\n10 rows in set (0.00 sec)\r\nQuery OK, 0 rows affected (0.00 sec)<\/code><\/pre>\n<\/div>\n<p>Has creado correctamente un procedimiento almacenado sin par\u00e1metros que devuelve todos los coches de la tabla Coches ordenados de una forma espec\u00edfica. Puedes usar este m\u00e9todo en varias aplicaciones.<\/p>\n<p>En la siguiente secci\u00f3n, crear\u00e1 un procedimiento que acepta par\u00e1metros para cambiar el comportamiento del procedimiento en funci\u00f3n de la entrada del usuario.<\/p>\n<h2 id=\"%d8%a7%db%8c%d8%ac%d8%a7%d8%af-%db%8c%da%a9-%d8%b1%d9%88%db%8c%d9%87-%d8%b0%d8%ae%db%8c%d8%b1%d9%87-%d8%b4%d8%af%d9%87-%d8%a8%d8%a7-%d9%be%d8%a7%d8%b1%d8%a7%d9%85%d8%aa%d8%b1-%d9%88%d8%b1%d9%88%d8%af\">Creaci\u00f3n de un procedimiento almacenado con par\u00e1metros de entrada<\/h2>\n<p>En esta secci\u00f3n, se agregan par\u00e1metros de entrada a la definici\u00f3n del procedimiento almacenado para permitir que los usuarios que ejecutan el procedimiento le pasen datos. Por ejemplo, los usuarios pueden proporcionar filtros de consulta.<\/p>\n<p>El procedimiento almacenado anterior, `get_all_cars`, siempre recupera todos los coches de la tabla `cars`. Creemos otro procedimiento para encontrar coches de un a\u00f1o de fabricaci\u00f3n determinado. Para ello, defina un par\u00e1metro llamado `get_all_cars` en la definici\u00f3n del procedimiento.<\/p>\n<p>Ejecuta el siguiente c\u00f3digo:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>DELIMITER \/\/\r\nCREATE PROCEDURE get_cars_by_year(\r\nIN year_filter int\r\n)\r\nBEGIN\r\nSELECT * FROM cars WHERE year = year_filter ORDER BY make, value DESC;\r\nEND \/\/\r\nDELIMITER ;<\/code><\/pre>\n<\/div>\n<p>Se han introducido varios cambios en el c\u00f3digo de creaci\u00f3n de procedimientos con respecto a la secci\u00f3n anterior.<\/p>\n<p>En primer lugar, el nombre es get_cars_by_year, que describe el m\u00e9todo: Recuperar coches en funci\u00f3n de su a\u00f1o de fabricaci\u00f3n.<\/p>\n<p>Los par\u00e9ntesis vac\u00edos anteriores ahora contienen la definici\u00f3n de un par\u00e1metro: `IN year_filter int`. La palabra clave `IN` indica a la base de datos que el usuario que realiza la llamada est\u00e1 pasando el par\u00e1metro al procedimiento. `year_filter` es un nombre arbitrario para el par\u00e1metro. Se utilizar\u00e1 para referirse a \u00e9l en el c\u00f3digo del procedimiento. Finalmente, `int` es el tipo de dato. En este caso, el a\u00f1o de fabricaci\u00f3n se expresa como un valor num\u00e9rico.<\/p>\n<p>El par\u00e1metro year_filter definido despu\u00e9s del nombre del procedimiento aparece en la instrucci\u00f3n SELECT en la cl\u00e1usula WHERE year = year_filter y filtra la tabla de autom\u00f3viles por su a\u00f1o de fabricaci\u00f3n.<\/p>\n<p>La base de datos responder\u00e1 una vez m\u00e1s con un mensaje de \u00e9xito:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nQuery OK, 0 rows affected (0.02 sec)<\/code><\/pre>\n<\/div>\n<p>Intenta ejecutar el procedimiento sin pasarle ning\u00fan par\u00e1metro, igual que antes:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>CALL get_cars_by_year;\r\n<\/code><\/pre>\n<\/div>\n<p>La base de datos MySQL devuelve un mensaje de error:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Error message\r\nERROR 1318 (42000): Incorrect number of arguments for PROCEDURE procedures.get_cars_by_year; expected 1, got 0<\/code><\/pre>\n<\/div>\n<p>En este caso, el procedimiento almacenado espera que se le proporcione un par\u00e1metro, pero no se le ha proporcionado ninguno. Para llamar a un procedimiento almacenado con par\u00e1metros, puede proporcionar los valores de los par\u00e1metros entre par\u00e9ntesis en el mismo orden en que el procedimiento los espera. Para recuperar los coches fabricados en 2017, ejecute lo siguiente:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>CALL get_cars_by_year(2017);\r\n<\/code><\/pre>\n<\/div>\n<p>Ahora el procedimiento llamado se ejecuta correctamente y devuelve la lista de coches de ese a\u00f1o:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\n+---------+---------------+------+-----------+\r\n| make | model | year | value |\r\n+---------+---------------+------+-----------+\r\n| Ferrari | 812 Superfast | 2017 | 335300.00 |\r\n| Porsche | 718 Boxster | 2017 | 48880.00 |\r\n+---------+---------------+------+-----------+\r\n2 rows in set (0.00 sec)\r\nQuery OK, 0 rows affected (0.00 sec)<\/code><\/pre>\n<\/div>\n<p>En este ejemplo, aprendi\u00f3 c\u00f3mo pasar par\u00e1metros de entrada a procedimientos almacenados y c\u00f3mo utilizarlos en consultas dentro de un procedimiento para proporcionar opciones de filtro.<\/p>\n<p>En la siguiente secci\u00f3n, utilizar\u00e1 par\u00e1metros de salida para crear procedimientos que devuelvan m\u00faltiples valores diferentes en una sola ejecuci\u00f3n.<\/p>\n<h2 id=\"%d8%a7%db%8c%d8%ac%d8%a7%d8%af-%db%8c%da%a9-%d8%b1%d9%88%db%8c%d9%87-%d8%b0%d8%ae%db%8c%d8%b1%d9%87-%d8%b4%d8%af%d9%87-%d8%a8%d8%a7-%d9%be%d8%a7%d8%b1%d8%a7%d9%85%d8%aa%d8%b1%d9%87%d8%a7%db%8c-%d9%88\">Creaci\u00f3n de un procedimiento almacenado con par\u00e1metros de entrada y salida<\/h2>\n<p>En ambos ejemplos anteriores, los procedimientos almacenados que cre\u00f3 llamaron a la instrucci\u00f3n SELECT para devolver un conjunto de resultados. Sin embargo, en algunos casos, es posible que necesite un procedimiento almacenado que devuelva varios valores diferentes en conjunto, en lugar de un \u00fanico conjunto de resultados para una consulta.<\/p>\n<p>Supongamos que desea crear un procedimiento que proporcione informaci\u00f3n resumida sobre los autom\u00f3viles de un a\u00f1o determinado, incluyendo el n\u00famero de autom\u00f3viles en la colecci\u00f3n y su valor de mercado (m\u00ednimo, m\u00e1ximo y promedio).<\/p>\n<p>Para ello, puede usar par\u00e1metros OUT al crear un nuevo procedimiento almacenado. Al igual que los par\u00e1metros IN, los par\u00e1metros OUT tienen un nombre y un tipo de datos asociados. Sin embargo, en lugar de pasar datos al procedimiento almacenado, se pueden rellenar con datos del procedimiento almacenado para devolver valores al usuario que realiza la llamada.<\/p>\n<p>Crea un procedimiento get_car_stats_by_year que devuelva datos resumidos de los coches de un a\u00f1o de producci\u00f3n determinado, utilizando los siguientes par\u00e1metros de salida:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>DELIMITER \/\/\r\nCREATE PROCEDURE get_car_stats_by_year(\r\nIN year_filter int,\r\nOUT cars_number int,\r\nOUT min_value decimal(10, 2),\r\nOUT avg_value decimal(10, 2),\r\nOUT max_value decimal(10, 2)\r\n)\r\nBEGIN\r\nSELECT COUNT(*), MIN(value), AVG(value), MAX(value)\r\nINTO cars_number, min_value, avg_value, max_value\r\nFROM cars\r\nWHERE year = year_filter ORDER BY make, value DESC;\r\nEND \/\/\r\nDELIMITER ;<\/code><\/pre>\n<\/div>\n<p>En esta ocasi\u00f3n, adem\u00e1s del par\u00e1metro de entrada `year_filter`, que se utiliza para filtrar los coches por a\u00f1o de fabricaci\u00f3n, se definen cuatro par\u00e1metros de salida entre par\u00e9ntesis. El par\u00e1metro `cars_number` es de tipo entero y devuelve el n\u00famero de coches del conjunto. Los par\u00e1metros `min_value`, `avg_value` y `max_value` representan el valor de mercado y se definen con el tipo decimal (10, 2) (similar a la columna `value` de la tabla `cars`). Estos par\u00e1metros devuelven informaci\u00f3n sobre los coches m\u00e1s baratos y m\u00e1s caros del conjunto, as\u00ed como el precio medio de todos los coches que coinciden con la b\u00fasqueda.<\/p>\n<p>La instrucci\u00f3n SELECT busca cuatro valores en la tabla de coches utilizando funciones matem\u00e1ticas SQL: COUNT para obtener el n\u00famero total de coches y MIN, AVG y MAX para obtener los valores m\u00ednimo, promedio y m\u00e1ximo de la columna de valores.<\/p>\n<p>Para indicar a la base de datos que los resultados de esa consulta deben almacenarse en los par\u00e1metros de salida del procedimiento almacenado, se ha introducido una nueva palabra clave llamada INTO. Tras la palabra clave INTO, se enumeran los nombres de los cuatro par\u00e1metros del procedimiento relacionados con los datos recuperados. Esto har\u00e1 que MySQL almacene el valor de COUNT(*) en el par\u00e1metro cars_number, el resultado de MIN(value) en el par\u00e1metro min_value, y as\u00ed sucesivamente.<\/p>\n<p>La base de datos confirma la correcta creaci\u00f3n del procedimiento:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nQuery OK, 0 rows affected (0.02 sec)<\/code><\/pre>\n<\/div>\n<p>Ahora ejecute la nueva rutina ejecutando lo siguiente:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>CALL get_car_stats_by_year(2017, @number, @min, @avg, @max);\r\n<\/code><\/pre>\n<\/div>\n<p>Los cuatro nuevos par\u00e1metros comienzan con el s\u00edmbolo @. Estos son los nombres de variables locales en la consola de MySQL que puede usar para almacenar datos temporalmente. Al pasarlos al procedimiento almacenado que cre\u00f3, este inserta valores en dichas variables.<\/p>\n<p>La base de datos responder\u00e1 con lo siguiente:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nQuery OK, 1 row affected (0.00 sec)<\/code><\/pre>\n<\/div>\n<p>Esto difiere del comportamiento anterior, donde los resultados se mostraban inmediatamente en pantalla. Esto se debe a que los resultados del procedimiento almacenado se guardan en par\u00e1metros de salida y no se devuelven como resultados de la consulta. Para acceder a los resultados, puede seleccionarlos directamente en la consola de MySQL de la siguiente manera:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>SELECT @number, @min, @avg, @max;\r\n<\/code><\/pre>\n<\/div>\n<p>Con esta consulta, se seleccionan valores de variables locales, en lugar de volver a llamar al procedimiento. El procedimiento almacenado guarda sus resultados en esas variables, y los datos est\u00e1n disponibles hasta que se cierra la sesi\u00f3n.<\/p>\n<p><span style=\"color: #ff0000;\">Nota: Para obtener m\u00e1s informaci\u00f3n sobre el uso de variables definidas por el usuario en MySQL, consulte la secci\u00f3n Variables definidas por el usuario de la documentaci\u00f3n. En el desarrollo de aplicaciones, la forma de acceder a los datos devueltos por los procedimientos almacenados var\u00eda seg\u00fan el lenguaje de programaci\u00f3n y el marco de trabajo. En caso de duda, consulte la documentaci\u00f3n del lenguaje y el marco de trabajo que utilice.<\/span><\/p>\n<p>La salida muestra los valores de las variables de consulta:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\n+---------+----------+-----------+-----------+\r\n| @number | @min | @avg | @max |\r\n+---------+----------+-----------+-----------+\r\n| 2 | 48880.00 | 192090.00 | 335300.00 |\r\n+---------+----------+-----------+-----------+\r\n1 row in set (0.00 sec)<\/code><\/pre>\n<\/div>\n<p>Los valores corresponden al n\u00famero de coches producidos en 2017, as\u00ed como al valor de mercado m\u00ednimo, medio y m\u00e1ximo de los coches de ese a\u00f1o de producci\u00f3n.<\/p>\n<p>En este ejemplo, aprendi\u00f3 a usar par\u00e1metros de salida para devolver varios valores diferentes desde un procedimiento almacenado para su uso posterior. En la siguiente secci\u00f3n, aprender\u00e1 a eliminar los procedimientos creados.<\/p>\n<h2 id=\"%d8%ad%d8%b0%d9%81-%d8%b1%d9%88%db%8c%d9%87-%d9%87%d8%a7%db%8c-%d8%b0%d8%ae%db%8c%d8%b1%d9%87-%d8%b4%d8%af%d9%87\">Eliminar procedimientos almacenados<\/h2>\n<p>En esta secci\u00f3n, eliminar\u00e1 los procedimientos almacenados en la base de datos.<\/p>\n<p>En ocasiones, un procedimiento que hayas creado puede dejar de ser necesario. En otras ocasiones, es posible que desees modificar su funcionamiento. MySQL no permite modificar la definici\u00f3n de un procedimiento una vez creado, por lo que la \u00fanica soluci\u00f3n es eliminarlo y volver a crearlo con los cambios deseados.<\/p>\n<p>Eliminemos el \u00faltimo procedimiento, get_car_stats_by_year. Para ello, puede utilizar la instrucci\u00f3n DROP PROCEDURE:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>DROP PROCEDURE get_car_stats_by_year;\r\n<\/code><\/pre>\n<\/div>\n<p>La base de datos confirma la eliminaci\u00f3n exitosa del procedimiento con un mensaje de \u00e9xito:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Output\r\nQuery OK, 0 rows affected (0.02 sec)<\/code><\/pre>\n<\/div>\n<p>Puede comprobar que el procedimiento se ha eliminado intentando llamarlo. Ejecutar:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>CALL get_car_stats_by_year(2017, @number, @min, @avg, @max);\r\n<\/code><\/pre>\n<\/div>\n<p>Esta vez, ver\u00e1 un mensaje de error que indica que el procedimiento no existe en la base de datos:<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-plain\" data-lang=\"Plain Text\"><code>Error message\r\nERROR 1305 (42000): PROCEDURE procedures.get_car_stats_by_year does not exist<\/code><\/pre>\n<\/div>\n<p>En esta secci\u00f3n, aprendi\u00f3 c\u00f3mo eliminar procedimientos almacenados de una base de datos.<\/p>\n<h2 id=\"%d9%86%d8%aa%db%8c%d8%ac%d9%87\">Resultado<\/h2>\n<p>Siguiendo esta gu\u00eda, aprendi\u00f3 qu\u00e9 son los procedimientos almacenados y c\u00f3mo usarlos en MySQL para guardar instrucciones reutilizables en procedimientos con nombre y ejecutarlas posteriormente. Cre\u00f3 procedimientos almacenados sin par\u00e1metros y procedimientos con par\u00e1metros de entrada y salida para mayor flexibilidad.<\/p>","protected":false},"excerpt":{"rendered":"Introducci\u00f3n Normalmente, cuando se trabaja con una base de datos relacional, las consultas de lenguaje de consulta estructurado (SQL)\u2026","protected":false},"author":1,"featured_media":15989,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_focuskw":"\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL","_yoast_wpseo_title":"","_yoast_wpseo_metadesc":"","_yoast_wpseo_canonical":"","_yoast_wpseo_opengraph-description":"","_yoast_wpseo_opengraph-image":"","_yoast_wpseo_twitter-description":"","_yoast_wpseo_twitter-image":"","_yoast_wpseo_focuskeywords":"","_yoast_wpseo_primary_category":"193","footnotes":""},"categories":[193,349],"tags":[403,391],"class_list":{"0":"post-15988","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-tutorials","8":"category-database","9":"tag-data-base","10":"tag-mysql"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL - \u0628\u0644\u0627\u06af ITPiran<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.itpiran.net\/blog\/es\/tutorials\/how-to-use-stored-procedures-in-mysql\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL - \u0628\u0644\u0627\u06af ITPiran\" \/>\n<meta property=\"og:description\" content=\"\u0645\u0642\u062f\u0645\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0639\u0645\u0648\u0644\u060c \u0647\u0646\u06af\u0627\u0645 \u06a9\u0627\u0631 \u0628\u0627 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627\u0628\u0637\u0647\u200c\u0627\u06cc\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0632\u0628\u0627\u0646 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0633\u0627\u062e\u062a\u0627\u0631\u06cc\u0627\u0641\u062a\u0647 (SQL)&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.itpiran.net\/blog\/es\/tutorials\/how-to-use-stored-procedures-in-mysql\/\" \/>\n<meta property=\"og:site_name\" content=\"\u0628\u0644\u0627\u06af ITPiran\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-29T11:21:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.itpiran.net\/2024\/07\/29143001\/sql2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1793\" \/>\n\t<meta property=\"og:image:height\" content=\"1110\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/person\\\/04ed27b919baca468a2273f8e4318f81\"},\"headline\":\"\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL\",\"datePublished\":\"2024-07-29T11:21:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/\"},\"wordCount\":169,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/07\\\/29143001\\\/sql2.jpg\",\"keywords\":[\"data base\",\"MySQL\"],\"articleSection\":[\"\u0622\u0645\u0648\u0632\u0634\u06cc\",\"\u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/\",\"name\":\"\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL - \u0628\u0644\u0627\u06af ITPiran\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/07\\\/29143001\\\/sql2.jpg\",\"datePublished\":\"2024-07-29T11:21:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/#primaryimage\",\"url\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/07\\\/29143001\\\/sql2.jpg\",\"contentUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/07\\\/29143001\\\/sql2.jpg\",\"width\":1793,\"height\":1110},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/how-to-use-stored-procedures-in-mysql\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u0622\u0645\u0648\u0632\u0634\u06cc\",\"item\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/category\\\/tutorials\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/\",\"name\":\"\u0628\u0644\u0627\u06af ITPiran\",\"description\":\"\u0627\u062e\u0628\u0627\u0631 \u0648 \u0645\u0642\u0627\u0644\u0627\u062a \u062a\u062c\u0627\u0631\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u06cc\u0631\u0627\u0646\u06cc\u0627\u0646\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#organization\",\"name\":\"\u0628\u0644\u0627\u06af \u062a\u062c\u0627\u0631\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u06cc\u0631\u0627\u0646\u06cc\u0627\u0646\",\"alternateName\":\"ITPIran Blog\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/cdn.itpiran.net\\\/2023\\\/12\\\/27150508\\\/cropped-ITPIRAN-BLOG-LOGO-2.png\",\"contentUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2023\\\/12\\\/27150508\\\/cropped-ITPIRAN-BLOG-LOGO-2.png\",\"width\":512,\"height\":512,\"caption\":\"\u0628\u0644\u0627\u06af \u062a\u062c\u0627\u0631\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u06cc\u0631\u0627\u0646\u06cc\u0627\u0646\"},\"image\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/person\\\/04ed27b919baca468a2273f8e4318f81\",\"name\":\"admin\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/es\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C\u00f3mo usar procedimientos almacenados en MySQL - Blog de ITPiran","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.itpiran.net\/blog\/es\/tutorials\/how-to-use-stored-procedures-in-mysql\/","og_locale":"es_ES","og_type":"article","og_title":"\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL - \u0628\u0644\u0627\u06af ITPiran","og_description":"\u0645\u0642\u062f\u0645\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0639\u0645\u0648\u0644\u060c \u0647\u0646\u06af\u0627\u0645 \u06a9\u0627\u0631 \u0628\u0627 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627\u0628\u0637\u0647\u200c\u0627\u06cc\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0632\u0628\u0627\u0646 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0633\u0627\u062e\u062a\u0627\u0631\u06cc\u0627\u0641\u062a\u0647 (SQL)&hellip;","og_url":"https:\/\/www.itpiran.net\/blog\/es\/tutorials\/how-to-use-stored-procedures-in-mysql\/","og_site_name":"\u0628\u0644\u0627\u06af ITPiran","article_published_time":"2024-07-29T11:21:52+00:00","og_image":[{"width":1793,"height":1110,"url":"https:\/\/cdn.itpiran.net\/2024\/07\/29143001\/sql2.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"admin","Tiempo de lectura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/#article","isPartOf":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/"},"author":{"name":"admin","@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/person\/04ed27b919baca468a2273f8e4318f81"},"headline":"\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL","datePublished":"2024-07-29T11:21:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/"},"wordCount":169,"commentCount":0,"publisher":{"@id":"https:\/\/www.itpiran.net\/blog\/#organization"},"image":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.itpiran.net\/2024\/07\/29143001\/sql2.jpg","keywords":["data base","MySQL"],"articleSection":["\u0622\u0645\u0648\u0632\u0634\u06cc","\u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/","url":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/","name":"C\u00f3mo usar procedimientos almacenados en MySQL - Blog de ITPiran","isPartOf":{"@id":"https:\/\/www.itpiran.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/#primaryimage"},"image":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.itpiran.net\/2024\/07\/29143001\/sql2.jpg","datePublished":"2024-07-29T11:21:52+00:00","breadcrumb":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/#primaryimage","url":"https:\/\/cdn.itpiran.net\/2024\/07\/29143001\/sql2.jpg","contentUrl":"https:\/\/cdn.itpiran.net\/2024\/07\/29143001\/sql2.jpg","width":1793,"height":1110},{"@type":"BreadcrumbList","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/how-to-use-stored-procedures-in-mysql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.itpiran.net\/blog\/"},{"@type":"ListItem","position":2,"name":"\u0622\u0645\u0648\u0632\u0634\u06cc","item":"https:\/\/www.itpiran.net\/blog\/category\/tutorials\/"},{"@type":"ListItem","position":3,"name":"\u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u0647 \u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 MySQL"}]},{"@type":"WebSite","@id":"https:\/\/www.itpiran.net\/blog\/#website","url":"https:\/\/www.itpiran.net\/blog\/","name":"Blog de ITPiran","description":"Noticias y art\u00edculos sobre comercio sostenible en Ir\u00e1n","publisher":{"@id":"https:\/\/www.itpiran.net\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.itpiran.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.itpiran.net\/blog\/#organization","name":"Blog sobre negocios iran\u00edes sostenibles","alternateName":"ITPIran Blog","url":"https:\/\/www.itpiran.net\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cdn.itpiran.net\/2023\/12\/27150508\/cropped-ITPIRAN-BLOG-LOGO-2.png","contentUrl":"https:\/\/cdn.itpiran.net\/2023\/12\/27150508\/cropped-ITPIRAN-BLOG-LOGO-2.png","width":512,"height":512,"caption":"\u0628\u0644\u0627\u06af \u062a\u062c\u0627\u0631\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u06cc\u0631\u0627\u0646\u06cc\u0627\u0646"},"image":{"@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/person\/04ed27b919baca468a2273f8e4318f81","name":"administraci\u00f3n","url":"https:\/\/www.itpiran.net\/blog\/es\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts\/15988","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/comments?post=15988"}],"version-history":[{"count":2,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts\/15988\/revisions"}],"predecessor-version":[{"id":15991,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts\/15988\/revisions\/15991"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/media\/15989"}],"wp:attachment":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/media?parent=15988"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/categories?post=15988"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/tags?post=15988"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}