8 votes

Pourquoi spécifier un délimiteur pour une procédure stockée quand il y a BEGIN et END ?

Je comprends que pour transmettre une procédure stockée au serveur dans son ensemble, nous devons déclarer un nouveau délimiteur qui ne permettra pas à MySQL d'interpréter les déclarations une par une. Ainsi, notre procédure stockée ressemblerait à quelque chose comme ceci :

delimiter $$
create procedure some_procedure()
begin
insert into table1 select * from table2;
select * from table1;
end $$
delimiter ;

En regardant ce code, j'ai remarqué qu'il y a en fait deux "choses" qui regroupent nos requêtes. Il s'agit de BEGIN-END mot-clé et $$ delimètre . Ma question est de savoir pourquoi nous avons besoin des deux et si ce n'est pas redondant.

Si quelqu'un prévoit de répondre à cette question, nous devons préciser BEGIN-END à cause de la syntaxe de la procédure stockée, ils se tromperaient, car elle est non obligatoire s'il contient une seule requête :

create procedure another_procedure()
select * from table2;

Quelqu'un peut-il me dire ce que j'ai manqué ici ?

3voto

Javier G.Raya Points 72

Procédures

Une procédure stockée est un ensemble d'instructions SQL qui est stocké en association avec une base de données. C'est un objet qui est créé avec l'option CRÉER UNE PROCÉDURE et invoquée avec l'instruction Déclaration CALL . Une procédure peut avoir zéro ou plusieurs paramètres d'entrée et zéro ou plusieurs paramètres de sortie.

Syntaxe :

CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }

routine_body:
    Valid SQL routine statement

DELIMITEUR

Pour définir une procédure stockée, il est nécessaire de modifier temporairement le caractère séparateur utilisé pour délimiter les instructions SQL.

Le caractère séparateur par défaut utilisé en SQL est le point-virgule ( ;). Dans les exemples que nous allons réaliser, nous allons utiliser les caractères $$ pour délimiter les instructions SQL, mais il est possible d'utiliser tout autre caractère.

Exemple :

Dans cet exemple, nous définissons les caractères $$ comme séparateurs entre les instructions SQL.

DELIMITER $$

Dans cet exemple, nous configurons à nouveau que le caractère séparateur est le point-virgule.

DELIMITER ;

Paramètres d'entrée, de sortie et d'entrée/sortie

Dans les procédures stockées, nous pouvons avoir trois types de paramètres :

  • Entrée : Ils sont indiqués en plaçant le mot réservé IN devant le nom du paramètre. Ces paramètres ne peuvent pas changer de valeur à l'intérieur de la procédure, c'est-à-dire qu'à la fin de la procédure, ces paramètres auront la même valeur qu'ils avaient lors de l'appel de la procédure. En programmation, cela équivaudrait à passer par la valeur d'un paramètre

  • Sortie : Ils sont indiqués en plaçant le mot réservé OUT devant le nom du paramètre. Ces paramètres changent de valeur au cours de la procédure. Lorsque l'appel de la procédure est effectué, ils commencent avec une valeur initiale et lorsque l'exécution de la procédure se termine, ils peuvent se terminer avec une valeur différente. En programmation, cela équivaudrait à passer un paramètre par référence.

  • Entrée/Sortie : Il s'agit d'une combinaison de types IN et OUT. Ces paramètres sont indiqués en plaçant le mot réservé IN/OUT devant le nom du paramètre.

Blocs PL/SQL anonymes

Nous commencerons par les blocs anonymes, caractérisés par le fait qu'ils n'ont pas de nom et sont généralement créés et exécutés à partir de PL/SQL.

Je vais vous expliquer en détail ce que fait chacun d'entre eux :

  • DECLARE : dans cette zone nous ferons la déclaration des variables que nous utiliserons dans begin. S'il n'y a pas de variables à déclarer, il n'est pas nécessaire de la mettre.

  • BEGIN : cette zone contient le code PL/SQL à exécuter.

  • FIN : indique la fermeture du bloc anonyme.

J'espère que tout ceci vous a aidé, meilleures salutations.

2voto

Luuk Points 121

Dans les docs, 25.1 Définition des programmes stockés il est dit :

Si vous utilisez le programme client mysql pour définir un programme enregistré contenant des caractères point-virgule, un problème se pose. Par défaut, mysql reconnaît lui-même le point-virgule comme un délimiteur d'instruction, vous devez donc vous devez donc redéfinir temporairement le délimiteur pour que mysql transmette au serveur la définition du programme stocké au serveur.

Le point-virgule est donc toujours (y compris lorsqu'il est utilisé dans un bloc BEGIN/END) considéré comme un délimiteur de déclaration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X