Kiedy muszę używać średnika zamiast ukośnika w Oracle SQL?
Dyskutowaliśmy w tym tygodniu w mojej firmie o tym, jak powinniśmy pisać nasze skrypty SQL.
Tło: Nasza baza danych to Oracle 10g (wkrótce aktualizacja do 11). Nasz zespół DBA używa SQLPlus w celu wdrożenia naszych skryptów do produkcji.
Niedawno mieliśmy deploy, które nie powiodło się, ponieważ używało zarówno średnika, jak i ukośnika (/
). Średnik znajdował się na końcu każdego polecenia, a ukośnik pomiędzy wypowiedziami.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Były jakieś wyzwalacze są dodawane później w skrypcie, niektóre widoki tworzone, a także niektóre procedury przechowywane. Posiadanie zarówno ;
, jak i /
powodowało, że każde polecenie uruchamiało się dwukrotnie, powodując błędy (zwłaszcza na wkładkach, które musiały być unikalne).
W SQL Developer tak się nie dzieje, w TOAD tak się nie dzieje. Jeśli uruchomisz określone 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 uważany za część podprogramu, więc musisz użyć ukośnika.
Moje pytanie jest takie: Jeśli twoja baza danych to Oracle, jaki jest właściwy sposób na napisanie skryptu SQL? Ponieważ wiesz, że DB jest Oracle należy zawsze używać /
?
6 answers
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 wybierane przez oko.
Ponadto, jeśli w końcu przeniesiesz się do czegoś takiego jak Ant w celu wdrożenia, uprości to definicję celów, aby mieć spójny ogranicznik instrukcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-03 17:12:25
Wiem, że to stary wątek, ale natknąłem się na niego i czuję, że nie zostało to do końca wyjaśnione.
Istnieje ogromna różnica w SQL * Plus między znaczeniem /
i ;
, ponieważ działają one inaczej.
;
Kończy polecenie SQL, podczas gdy /
wykonuje to, co znajduje się w bieżącym "buforze". Więc kiedy używasz ;
i a /
deklaracja jest faktycznie wykonywana dwukrotnie.
Możesz to łatwo zobaczyć używając /
po uruchomieniu instrukcji:
SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:37:20 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options
SQL> drop table foo;
Table dropped.
SQL> /
drop table foo
*
ERROR at line 1:
ORA-00942: table or view does not exist
W tym przypadku rzeczywiście zauważa się błąd.
Ale zakładając, że istnieje taki skrypt SQL:
drop table foo;
/
A to jest uruchamiane z SQL * Plus wtedy będzie to bardzo mylące:
SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:38:05 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options
SQL> @drop
Table dropped.
drop table foo
*
ERROR at line 1:
ORA-00942: table or view does not exist
/
jest głównie wymagane w celu uruchomienia instrukcji, które mają osadzone ;
Jak CREATE PROCEDURE
instrukcja.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 10:40:08
Chciałem wyjaśnić trochę więcej użycia między ;
i /
W SQLPLUS:
-
;
oznacza "Zakończ bieżącą instrukcję, wykonaj ją i zapisz do bufora sqlplus" -
<newline>
po D. M. L. (SELECT, UPDATE, INSERT,...) instrukcja lub niektóre typy instrukcji D. D. L (tworzenie tabel i widoków) (które nie zawierają;
), to znaczy, przechowują instrukcję w buforze, ale jej nie uruchamiają. -
/
po wprowadzeniu instrukcji do bufora (z pustym<newline>
) oznacza " Uruchom D. M. L. Lub D. D. L. Lub PL / SQL w buforze. -
RUN
lubR
jest poleceniem sqlsplus, które pokazuje / wypisuje SQL w buforze i uruchamia go. Nie spowoduje zakończenia instrukcji SQL. - W przeciwieństwie do SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a, SQL-a]}
Uwaga: ponieważ {[1] } są używane dla PL/SQL do zakończenia instrukcji ;
nie mogą być użyte przez SQLPLUS do oznacza "Zakończ bieżącą instrukcję, wykonaj ją i zapisz do bufora sqlplus", ponieważ chcemy, aby cały blok PL / SQL był całkowicie w buforze, a następnie go wykonaj. Bloki PL / SQL muszą kończyć się na:
END;
/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-15 18:57:38
Prawie wszystkie wdrożenia Oracle są wykonywane przez SQL * Plus (to dziwne małe narzędzie wiersza poleceń, którego używa Twój DBA). A w SQL*Plus pojedynczy ukośnik w zasadzie oznacza "wykonaj ponownie ostatnie polecenie SQL lub PL/SQL, które właśnie wykonałem".
Zobacz
Regułą byłoby użycie slash z rzeczami, które robią BEGIN .. END
lub gdzie można użyć CREATE OR REPLACE
.
Do wkładek, które muszą być unikatowe
INSERT INTO my_table ()
SELECT <values to be inserted>
FROM dual
WHERE NOT EXISTS (SELECT
FROM my_table
WHERE <identify data that you are trying to insert>)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 03:06:21
Z mojego zrozumienia, wszystkie instrukcje SQL nie potrzebują ukośnika, ponieważ będą uruchamiane automatycznie na końcu średników, w tym instrukcje DDL, DML, DCL i TCL.
Dla innych bloków PL / SQL, w tym procedur, funkcji, pakietów i wyzwalaczy, ponieważ są to programy liniowe, Oracle potrzebuje sposobu, aby wiedzieć, kiedy uruchomić blok, więc musimy napisać ukośnik na końcu każdego bloku, aby Oracle mógł go uruchomić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 03:06:48
Używam ukośnika tylko raz na końcu każdego skryptu, aby powiedzieć sqlplusowi, że nie ma więcej linii kodu. W środku scenariusza nie używam ukośnika.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-03 16:11:35