W tym tygodniu debatowaliśmy w mojej firmie na temat tego, jak powinniśmy pisać nasze skrypty SQL.
Kontekst: Nasza baza danych to Oracle 10g (wkrótce zostanie zaktualizowana do wersji 11). Nasz zespół DBA używa SQLPlus do wdrażania naszych skryptów do produkcji.
Teraz mieliśmy niedawno wdrożenie, które nie powiodło się, ponieważ użyło zarówno średnika, jak i ukośnika ( /
). Średnik znajdował się na końcu każdej instrukcji, a ukośnik między instrukcjami.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Niektóre wyzwalacze zostały dodane później w skrypcie, niektóre widoki zostały utworzone, a także niektóre procedury składowane. Posiadanie zarówno polecenia, jak ;
i /
wywoływało dwukrotne uruchomienie każdej instrukcji, powodując błędy (szczególnie we wstawkach, które musiały być unikalne).
W SQL Developer tak się nie dzieje, w TOAD tak się nie dzieje. Jeśli uruchomisz pewne polecenia, nie będą one działać bez /
w nich.
W PL / SQL, jeśli masz podprogram (DECLARE, BEGIN, END) użyty średnik będzie traktowany jako część podprogramu, więc musisz użyć ukośnika.
Więc moje pytanie brzmi: jeśli twoją bazą danych jest Oracle, jaki jest właściwy sposób pisania skryptu SQL? Skoro wiesz, że Twoją bazą danych jest Oracle, czy zawsze powinieneś używać /
?
sqlterminator
, aby!
jeśli chcesz) i konwencja ta ma tendencję do być przestrzegane przez innych narzędzi. Jednak język PL / SQL używa średników jako obowiązkowego elementu składni.Odpowiedzi:
To kwestia preferencji, ale wolę widzieć skrypty, które konsekwentnie używają ukośnika - w ten sposób wszystkie „jednostki” pracy (tworzenie obiektu PL / SQL, uruchamianie anonimowego bloku PL / SQL i wykonywanie instrukcji DML) mogą być łatwiej wybierać wzrokiem.
Ponadto, jeśli ostatecznie przejdziesz do czegoś takiego jak Ant w celu wdrożenia, uprości to definicję celów, aby uzyskać spójny ogranicznik instrukcji.
źródło
/
ani nie;
widzisz odpowiedzi @a_horse_with_no_name lub @Mr_Moneybags, aby uzyskać więcej kontekstuWiem, że to stary wątek, ale właśnie się na niego natknąłem i czuję, że nie zostało to do końca wyjaśnione.
W SQL * Plus istnieje ogromna różnica między znaczeniem a
/
i a,;
ponieważ działają one inaczej.Te
;
końce oświadczenie SQL, podczas gdy/
sporządzi co jest na prąd „bufor”. Więc kiedy używasz a;
i a,/
instrukcja jest wykonywana dwukrotnie.Możesz łatwo zobaczyć, że używając
/
po uruchomieniu instrukcji:W tym przypadku faktycznie zauważa się błąd.
Ale zakładając, że istnieje taki skrypt SQL:
A to jest uruchamiane z poziomu SQL * Plus, wtedy będzie to bardzo mylące:
Jest
/
on wymagany głównie do uruchamiania instrukcji, które są osadzone;
jakCREATE PROCEDURE
instrukcja.źródło
;
), musisz znaleźć sposób na określenie alternatywnego separatoraChciałem wyjaśnić trochę więcej użycia między
;
i/
W SQLPLUS:
;
oznacza "zakończ bieżącą instrukcję, wykonaj ją i zapisz w buforze SQLPLUS"<newline>
po instrukcji DML (SELECT, UPDATE, INSERT, ...) lub niektórych typach instrukcji DDL (tworzenie tabel i widoków) (które nie zawierają;
), oznacza to, że przechowuj instrukcję w buforze, ale nie uruchamiaj jej./
po wpisaniu instrukcji do bufora (ze spacją<newline>
) oznacza „uruchomić DML lub DDL lub PL / SQL w buforze.RUN
lubR
jest komendą sqlsplus, która wyświetla / wyświetla kod SQL w buforze i uruchamia go. Nie zakończy instrukcji SQL./
podczas wpisywania DML lub DDL lub PL / SQL oznacza "przerwanie aktualnej instrukcji, wykonanie jej i zapisanie do bufora SQLPLUS"UWAGA: Ponieważ
;
są używane dla PL / SQL do zakończenia instrukcji,;
nie mogą być używane przez SQLPLUS w znaczeniu „zakończ bieżącą instrukcję, wykonaj ją i zapisz w buforze SQLPLUS”, ponieważ chcemy, aby cały blok PL / SQL znajdował się całkowicie w bufor, a następnie wykonaj go. Bloki PL / SQL muszą kończyć się:źródło
Prawie wszystkie wdrożenia Oracle są wykonywane przez SQL * Plus (to dziwne małe narzędzie wiersza poleceń, z którego korzysta Twój administrator). A w SQL * Plus samotny ukośnik oznacza w zasadzie „ponownie wykonaj ostatnie polecenie SQL lub PL / SQL, które właśnie wykonałem”.
Widzieć
Praktyczną zasadą jest użycie ukośnika w przypadku rzeczy, które działają
BEGIN .. END
lub gdzie możesz użyćCREATE OR REPLACE
.Do wkładek, które wymagają wyjątkowego zastosowania
źródło
Z mojego zrozumienia, wszystkie instrukcje SQL nie wymagają ukośnika, ponieważ będą uruchamiane automatycznie na końcu średnika, w tym instrukcje DDL, DML, DCL i TCL.
W przypadku innych bloków PL / SQL, w tym procedur, funkcji, pakietów i wyzwalaczy, ponieważ są to programy wielowierszowe, Oracle potrzebuje sposobu, aby wiedzieć, kiedy uruchomić blok, więc musimy napisać ukośnik na końcu każdego bloku, aby niech Oracle to uruchomi.
źródło
Używam ukośnika tylko raz na końcu każdego skryptu, aby powiedzieć sqlplus, że nie ma więcej linii kodu. W środku skryptu nie używam ukośnika.
źródło