2009-07-14 8 views
0

En Java, vous pouvez effectuer les opérations suivantes à des variables de portée localement dans une méthode:enferment localement un bloc de code dans SQL

public void blah() { 
    { 
     int a = 1; 
     int b = 2; 
    } 
    { 
     int a = 3; 
     int b = 4; 
    } 
} 

Je ne sais même pas ce que le nom de cette technique est, j'ai seulement nécessaire pour l'utiliser une ou deux fois. Dans ma situation actuelle, cela peut vraiment être utile avec ce projet SQL.

Est-ce encore possible en SQL?


J'utilise MS SQL Server ... Pour donner plus de contexte à la situation:

Nous avons plusieurs scripts SQL stockés sous forme de fichiers qui aident à effectuer diverses opérations sur une base de données. Ces scripts sont assez volumineux et ont été conçus pour être exécutés indépendamment. Parfois, nous devons exécuter plusieurs de ces scripts ensemble et les livrer dans un seul fichier.

Étant donné que la plupart de ces scripts ont des variables communes, nous rencontrons un conflit lorsque nous joignons ces scripts ensemble. Bien sûr, il est facile de déplacer toutes les déclarations de variables au début du fichier, mais l'objectif est d'automatiser ce processus.

+0

Quel RDBMS utilisez-vous? Oracle? MySQL? Postgresql? –

+0

Si vous avez un SQL que vous souhaitez améliorer, ou même simplement un pseudo-code de type SQL, cela pourrait être un meilleur exemple. –

+0

Merci, j'ai ajouté un peu plus d'infos. – Kevin

Répondre

0

SQL est un langage déclaratif (c'est-à-dire qu'il se concentre sur le «quoi» et non le «comment»). Par conséquent, sa définition (ansi) ne contient pas de procédures et de blocs.

La plupart des implémentations de fournisseurs comblent ce vide en incorporant leur propre langage procédural - TSQL dans le cas de Microsoft, PL/SQL dans le cas d'Oracle etc. (pas sûr de Mysql et SQLlite etc.) - et même ils ne font pas correspondre avec Java (aucun codeblocks anonyme).

Chaque opération SQL fonctionne sur un ensemble et renvoie un ensemble.

Ainsi, "mytable" est un ensemble, "select from mytable" est un ensemble et "select from (select from mytable)" est un ensemble.

donc son genre de ne pas possible de forer vers le bas dans un niveau de granularité inférieur, peut-être « colonnes » ou colonnes pseudo sont les

« des variables »

Oracle définit une « select de double » pour garantir une « boucle 'de 1 (c'est-à-dire une instruction select qui renvoie exactement 1 ligne)

0

Dans MySQL, les déclarations de variables doivent se trouver au début de la sous-routine/procédure stockée, comme les variables d'une fonction C doivent l'être.

+0

C permet à un bloc {}, à l'intérieur d'une fonction, d'avoir ses propres déclarations de variables - les variables du bloc ont la durée de vie du bloc et peuvent en masquer les blocs externes (en Java, ce dernier est interdit). t compiler réellement en Java). –

0

Essayer de compiler l'exemple de code Java que vous donnez (enveloppé dans un class helo) ## Titre ## produit:

$ javac helo.java 
helo.java:7: a is already defined in blah() 
     int a = 3; 
      ^
helo.java:8: b is already defined in blah() 
     int b = 4; 
      ^
2 errors 

Alors, non, vous ne pouvez pas faire en Java (C, oui; C++, oui, Java, non).

SQL en soi n'a pas de portée lexicale, bien que certains dialectes de procédure stockée incorporés dans les DB relationnelles le soient sûrement (mais il est difficile d'aider sans connaître le dialecte exact). Dans SQL proprement dit, vous qualifiez les champs autrement homonymes avec les préfixes tablename..

+0

Je pense qu'il a juste donné un mauvais exemple –

+0

Oui, mauvais exemple. Bien que, j'ai utilisé ceci il y a quelques jours et cela a fonctionné, mais peut-être ai-je utilisé des noms de variables uniques dans le bloc. Hm ... – Kevin

+0

Le point est, vous ne pouvez pas affecter localement les variables homonymes dans un bloc en Java (bien que vous puissiez le faire dans d'autres langages) - ni en SQL en soi (bien que certains dialectes de procédure puissent différer, l'OP doit spécifier lequel [il] se soucie de). Java l'interdit délibérément parce que ses concepteurs l'ont considérée comme une mauvaise pratique même si elle était courante en C et C++ (je suis d'accord avec les concepteurs de Java sur ce point précis, FWIW). –

0

Dans SQL Server, vous ne pouvez pas utiliser des blocs. Tant que DECLARE est avant SET, vous êtes OK. Le ne Déclare pas être au début du lot ou le code soit

BEGIN 
    DECLARE @a int 
END 
BEGIN 
    SET @a = 1 
END 

IIRC, de même pour Sybase aussi.

Questions connexes