2009-07-14 20 views
0

In Java beilegen können Sie die folgenden Funktionen lokal Umfang Variablen innerhalb einer Methode tun:Lokal einen Codeblock in SQL

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

Ich weiß nicht einmal, was der Name für diese Technik ist, habe ich nur benötigt, um es ein- oder zweimal zu verwenden. In meiner jetzigen Situation könnte dies mit diesem SQL-Projekt wirklich nützlich sein.

Ist das in SQL überhaupt möglich?


Ich bin mit MS SQL Server ... Um mehr Kontext die Situation zu geben:

Wir haben mehr SQL-Skripte gespeichert als Dateien, die auf einer Datenbank verschiedene Operationen helfen. Diese Skripts sind ziemlich groß und wurden so entworfen, dass sie unabhängig voneinander ausgeführt werden können. Manchmal müssen wir mehrere dieser Skripts zusammen ausführen und in einer einzigen Datei bereitstellen.

Da die meisten dieser Skripte gemeinsame Variablen haben, stoßen wir beim Zusammenfügen dieser Skripte auf einen Konflikt. Natürlich ist es einfach, alle Variablendeklarationen an den Anfang der Datei zu verschieben, aber das Ziel besteht darin, diesen Prozess zu automatisieren.

+0

Welche RDBMS verwenden Sie? Orakel? MySQL? PostgreSQL? –

+0

Wenn Sie SQL haben, das Sie verbessern möchten, oder auch nur einen SQL-ähnlichen Pseudocode, könnte das ein besseres Beispiel sein. –

+0

Danke, ich habe ein bisschen mehr Info hinzugefügt. – Kevin

Antwort

0

SQL ist eine deklarative Sprache (d. H. Konzentriert sich auf das "was" und nicht auf das "wie"). Daher enthält seine Definition (Ansi) keine Prozeduren und Blöcke. Die meisten Anbieter-Implementierungen füllen diese Lücke, indem sie ihre eigene prozedurale Sprache einbetten - TSQL im Falle von Microsoft, PL/SQL im Falle von Oracle usw. (nicht sicher von Mysql und SQLlite usw.) - und selbst sie machen keine exakte Funktion Übereinstimmung mit Java (keine anonymen Codeblocks).

Jede SQL-Operation arbeitet an einer Menge und gibt eine Menge zurück.

Also "mytable" ist ein Satz, "aus mytable auswählen" ist ein Satz, und "wählen Sie aus (aus mytable auswählen)" ist ein Satz.

So seine Art nicht möglich, in eine untere Ebene der Granularität aufschlüsseln, vielleicht „Spalten“ oder Pseudo-Spalten sind die

‚Variablen‘

Oracle eine Operation „von Dual wählen“ definiert eine ‚Schleife zu gewährleisten 'von 1 (dh eine Select-Anweisung, die genau 1 Zeile zurückgibt)

0

In MySQL müssen Variablendeklarationen am Anfang des Unterprogramms/der gespeicherten Prozedur stehen, so wie die Variablen einer C-Funktion sein müssen.

+0

C erlaubt vollständig, dass ein {} -Block innerhalb einer Funktion eigene Variablendeklarationen hat - die Variablen des Blocks haben die Lebensdauer des Blocks und können äußere Blöcke abschirmen (in Java ist letzteres verboten, so dass der OP-Code nicht t tatsächlich in Java kompilieren). –

0

Der Versuch, das Java-Codebeispiel Sie ## Heading ## erzeugt (in einem class helo verpackt) geben zu kompilieren:

$ 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 

Also, nein, du nicht tun, dass in Java (C, ja; C++, ja; Java, nein).

SQL per se hat kein lexikalisches Scoping, obwohl einige Dialoge mit gespeicherten Prozeduren, die in relationalen DBs eingebettet sind, dies sicherlich können (aber es ist schwer zu helfen, den exakten Dialekt zu kennen). In SQL selbst qualifizieren Sie andernfalls-homonyme Felder mit tablename. Präfixen.

+0

Ich denke, er hat vielleicht ein schlechtes Beispiel gegeben –

+0

Ja, schlechtes Beispiel. Obwohl ich das vor einigen Tagen benutzt habe und es funktioniert, aber vielleicht habe ich eindeutige Variablennamen innerhalb des Blocks verwendet. Hm ... – Kevin

+0

Punkt ist, Sie _cannot_ lokal Bereich homonyme Variablen innerhalb eines Blocks in Java (obwohl Sie in anderen Sprachen können) - noch in SQL per se entweder (obwohl einige Prozedur Dialekte unterscheiden können, muss das OP angeben, welche [s] kümmert er sich). Java verbietet das absichtlich, weil seine Entwickler es für eine schlechte Praxis hielten, obwohl es in C und C++ üblich war (ich stimme den Java-Designern in diesem speziellen Punkt zu, FWIW). –

0

In SQL Server können Sie keinen Bereich in Blöcken anzeigen. Solange DECLARE vor SET ist, sind Sie in Ordnung. Das erklärt nicht zu Beginn der Partie oder Code sein müssen entweder

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

IIRC, das gleiche auch auf Sybase gilt.

Verwandte Themen