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ć /?

 147
Author: a_horse_with_no_name, 2009-07-03

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.

 28
Author: dpbradley,
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.

 278
Author: a_horse_with_no_name,
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:

  1. ; oznacza "Zakończ bieżącą instrukcję, wykonaj ją i zapisz do bufora sqlplus"
  2. <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ą.
  3. / po wprowadzeniu instrukcji do bufora (z pustym <newline>) oznacza " Uruchom D. M. L. Lub D. D. L. Lub PL / SQL w buforze.
  4. RUN lub R jest poleceniem sqlsplus, które pokazuje / wypisuje SQL w buforze i uruchamia go. Nie spowoduje zakończenia instrukcji SQL.
  5. 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;
/
 66
Author: Mr_Moneybags,
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

Http://ss64.com/ora/syntax-sqlplus.html

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>)
 21
Author: jva,
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ć.

 12
Author: Jerry,
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.

 2
Author: Jonathan,
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