sql >> Database teknologi >  >> RDS >> Oracle

Slash eller ingen Slash?

Det er spørgsmålet.

Et nyligt indlæg på OTN-foraene spurgte om brugen af ​​semikolon og skråstreger som erklæringsafslutninger. Jeg støvede en artikel af, som jeg skrev til vores udviklingsteam for over 4 år siden om dette emne. Denne artikel fik gode anmeldelser og er tilgængelig på OTN-foraene, hvis det ønskes. Jeg tænkte, at jeg også ville poste det på min blog. Her er artiklen:

Slash or No Slash

af Brian Peasland

Hos vores virksomhed udføres SQL-scripts, der er implementeret, i Oracles SQL*Plus-kommandolinjeværktøj, hvorimod mange udviklere bruger et GUI-værktøj som PL/SQL Developer eller SQL Developer. Den fremadrettede skråstreg betyder noget for SQL*Plus, som ikke er nødvendigt i PL/SQL Developer eller SQL Developer. Som sådan kan det være forvirrende at vide, om du skal inkludere en skråstreg i dine SQL-scripts eller ej. Forhåbentlig vil dette afsnit kaste lidt lys over, hvad den fremadrettede skråstreg gør, hvornår den skal bruges, og hvornår den ikke skal bruges. Semi-kolon Terminator For de fleste SQL-sætninger er semikolon sætningsterminatoren. Overvej f.eks. denne simple SQL-sætning, der køres i SQL*Plus:

SQL> vælg sysdate fra dual;

SYSDATE

———

18-JUN-12

Når SQL*Plus ser semikolonet, ved den, at slutningen af ​​SQL-sætningen er nået, og den kan nu udføre kommandoen.

SQL*Plus-buffer

Du er måske ikke klar over, at SQL*Plus har en buffer til sine kommandoer. Hvis jeg trykker på 'l'-tasten for 'liste', så kan jeg se kommandoen i øjeblikket i min sessions buffer.

SQL> l

1* vælg sysdate fra dual

Ikke overraskende er der den kommando, jeg lige har udført. Jeg udførte derefter en anden SQL-sætning, og her er, hvordan min buffer nu ser ud:

SQL> l

1 vælg sysdate,bruger

2* fra dobbelt

Som du kan se, har jeg nu to linjer i min sessions SQL*Plus buffer.

Slash =Udfør buffer

Den første regel at forstå om skråstreg er, at for SQL*Plus betyder skråstreg at udføre indholdet af bufferen. For at illustrere dette koncept vil jeg udføre en SQL-sætning, vente et par sekunder og derefter bare udføre den samme SQL-sætning igen, men blot udføre bufferen.

SQL> vælg to_char(sysdate,'MM/DD/YYYY HH24:MI:SS') fra dual;

TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:20:40

SQL> /
TO_CHAR(SYSDATE,’MM

——————-

06/18/2012 15:21:17

SQL> /

TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:21:50

Du kan se, at alt, hvad jeg gjorde anden og tredje gang, var bare at skrive '/' og trykke på enter, og SQL*Plus udførte indholdet af dens kommandobuffer hver gang.

PL/SQL-blokke

Semi-kolon-sætningsterminatoren fungerede fint i sig selv, indtil Oracle introducerede PL/SQL i Oracle version 7. Problemet er, at PL/SQL-blokke kan have flere semikoloner for at afslutte de individuelle sætninger, der udgør den blok. Overvej denne meget simple PL/SQL-blok, der ikke gør noget:

SQL> start

2 null;

3 null;

4 ende;

5

Linje 2 og 3 indeholder helt gyldige udsagn, der hver afsluttes med semikolon. Og i linje 4 har vi nøgleordet END, der angiver slutningen af ​​PL/SQL-blokken. Hvis vi ikke fik lov til indlejrede BEGIN/END-par, ser SQL*Plus hver gang "END;" det ville vide, at slutningen af ​​PL/SQL-blokken er nået, men vi tillades indlejrede BEGIN/END-par, så følgende er helt lovligt og gyldigt:

SQL> start

2 begynder

3 null;

4 ende;

5 null;

6 ende;

7

Du kan se fra ovenstående, at du bare leder efter "SLUT"; er ikke nok, fordi SQL*Plus ville have forsøgt at køre blokken efter linje 4. Så hvordan besluttede Oracle at angive, at PL/SQL-blokken var klar til at udføre? Svaret er ved at bruge skråstregen frem, som du måske allerede er klar over. Den anden regel at forstå er, at alt det fremadrettede skråstreg gør, når du bruger det til at afslutte en PL/SQL-blok, er at fortælle SQL*Plus at køre det, der er i bufferen! Dette har ikke ændret sig siden før PL/SQL blev oprettet til Oracle 7. Overvej følgende eksempel:

SQL> start

2 null;

3 ende;

4 /

PL/SQL-proceduren er gennemført.

SQL> l

1 start
2 null;

3* slutning;

På linje 4 skrev jeg skråstreg for at udføre PL/SQL-blokken. Du kan se, at min blokering er gennemført. Hvis vi går tilbage og ser på indholdet af min kommandobuffer, kan du se, at den indeholder alt undtagen skråstregen. Den fremadrettede skråstreg er ikke en del af kommandobufferen. Så nu kører jeg en anden PL/SQL-blok:

SQL> start

2 dbms_output.put_line('I dag er '||to_char(sysdate,'MM/DD/ÅÅÅÅ HH24:MI:SS'));

3 ende;

4 /

I dag er 06/18/2012 15:39:32

PL/SQL-proceduren er gennemført.

Den fremadrettede skråstreg sagde til SQL*Plus for at køre det, der er i dens buffer, og resultaterne vises. Lad os nu bare skrive skråstreg igen, og vi skulle se vores PL/SQL-blok blive udført igen.

SQL> /

I dag er 06/18/2012 15:40:42

PL/SQL-proceduren er gennemført.

Jeg behøvede ikke at skrive min PL/SQL-blok igen, da den i øjeblikket er i kommandobufferen.

PL/SQL- og SQL-udvikler og PL/SQL-blokke

Det største problem for de fleste udviklere er, at PL/SQL-udvikler og SQL-udvikler ikke kræver, at du bruger skråstreg. Hvorfor? Fordi du kan trykke på Execute (F8) eller Run Script (F5) for at køre din PL/SQL-blok. PL/SQL-udvikler ved, at i det øjeblik du trykker på F8, har du til hensigt at indsende PL/SQL-blokken, der skal udføres. I dette tilfælde udfører F8 i PL/SQL Developer det samme job som skråstregen i SQL*Plus. Tilsvarende for F5 i SQL Developer.

Problemet i min virksomhed er, at vores team, der implementerer kode til produktion, ikke implementerer kode med PL/SQL-udvikler eller SQL-udvikler. De bruger SQL*Plus, fordi scripting af flere udførelser er nemmere med et kommandolinjeværktøj. Mange udviklere begår den fejl, at de ikke inkluderer skråstreg for PL/SQL-blokke i scripts, fordi de ikke har brug for det, men hvis du vil implementere denne kodesektion i et SQL-script, kræves skråstregen i slutningen af ​​hver PL /SQL-blok.

Hvornår skal skråstreg ikke bruges

Så vi har set hvornår og hvorfor vi bruger den fremadrettede skråstreg, men hvornår er det dårligt at bruge det? Den tredje regel at vide er, at det er dårligt at bruge skråstregen efter en enkelt SQL-sætning (ikke i en PL/SQL-blok), især når den skråstreg umiddelbart følger efter en DML-sætning (INSERT, UPDATE eller DELETE). Hvis mit script indeholder følgende:

vælg sysdate fra dual;

/

Så vil jeg få "dobbelt output", hvilket ikke er hvad jeg normalt har tænkt mig at gøre i et script. Jeg vil egentlig kun have én linje returneret, ikke to, som ovenstående script ville gøre:

SQL> vælg sysdate fra dual;

SYSDATE

———

18-JUN-12
SQL> /

SYSDATE

———

18-JUN-12

Det er endnu værre, når jeg bruger den fremadrettede skråstreg efter en DML-sætning, fordi den erklæring bliver udført to gange. Overvej følgende script:

indsæt i test_tab-værdier (10);

/

Vi ved nu, at når jeg udfører de to linjer ovenfor i et script, vil SQL*Plus udføre det én gang på grund af semikolon-sætningsterminatoren og derefter udføre en anden gang, fordi skråstregen fortæller SQL*Plus at køre det, der er i kommandobuffer. Når jeg udfører scriptet med to linjer ovenfor, får jeg følgende output:

SQL> indsæt i test_tab-værdier (10);

1 række oprettet.

SQL>

/

indsæt i test_tab-værdier (10) *

FEJL på linje 1:ORA-00001:unik begrænsning (PEASLAND.SYS_C00767176) overtrådt

Ups! Den første indsættelse fungerede (1 række oprettet.), men da skråstregen blev indtastet, forsøgte SQL*Plus at indsætte de samme data, og jeg blev fanget i en unik overtrædelse af begrænsningen.

Konklusion

Forhåbentlig viser denne side, hvorfor den fremadgående skråstreg er nødvendig, hvad den gør, og hvornår den ikke skal bruges. For at opsummere:

  • Medtag skråstregen i slutningen af ​​hver PL/SQL-blok
  • Inkluder ikke skråstregen efter nogen SQL-sætninger, der ikke er i en PL/SQL-blok.
  • Skråstregen efter en enkelt SQL-sætning vil få denne SQL-kommando til at udføre to gange.

  1. MySQL-serveren er gået væk - på præcis 60 sekunder

  2. Arbejde med Java Data i Sisense

  3. Hvordan vælger man rækker, der har dagens tidsstempel?

  4. Konverter 'datetime' til 'datetime2' i SQL Server (T-SQL-eksempler)