Когда мне нужно использовать точку с запятой против косой черты в Oracle SQL?

на этой неделе у нас были некоторые дебаты в моей компании о том, как мы должны писать наши SQL-скрипты.

фон: Наша база данных Oracle 10g (обновление до 11 в ближайшее время). Наша команда DBA использует SQLPlus для развертывания наших скриптов на производстве.

недавно у нас было развертывание, которое не удалось, потому что оно использовало точку с запятой и косую черту (/). Точка с запятой в конце каждой инструкции и Слэш между заявления.

alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/

позже в скрипте были добавлены некоторые триггеры, созданы некоторые представления, а также некоторые хранимые процедуры. Имея оба ; и / заставил каждый оператор работать дважды, вызывая ошибки (особенно на вставках, которые должны быть уникальными).

в SQL Developer этого не происходит, в TOAD этого не происходит. Если вы запустите определенные команды, они не будут работать без / в них.

в PL / SQL, если у вас есть подпрограмма (DECLARE, BEGIN, END) используемая точка с запятой будет считаться частью подпрограммы, поэтому вы должны использовать косую черту.

Итак, мой вопрос таков: Если ваша база данных Oracle, каков правильный способ написать ваш SQL-скрипт? Поскольку вы знаете, что ваша БД является Oracle, вы всегда должны использовать /?

6 ответов


Это вопрос предпочтения, но я предпочитаю видеть скрипты, которые последовательно используют косую черту - таким образом, все "единицы" работы (создание объекта PL/SQL, запуск анонимного блока PL/SQL и выполнение оператора DML) могут быть выбраны более легко на глаз.

кроме того, если вы в конечном итоге перейдете к чему-то вроде Ant для развертывания, это упростит определение целей, чтобы иметь согласованный разделитель операторов.


существует огромная разница в SQL * Plus между значением / и a ; потому что они работают по-разному.

на ; завершает инструкцию SQL, тогда как / выполняет все, что находится в текущем "буфере". Поэтому, когда вы используете ; и a / оператор фактически выполняется дважды.

вы можете легко увидеть, что с помощью / после выполнения заявлении:

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

в этом случае фактически замечается ошибка.


Но предполагая, что есть SQL-скрипт, подобный этому:

drop table foo;
/

и это запускается из SQL * Plus, тогда это будет очень запутанным:

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

на / в основном требуется для запуска операторов, которые встроили ; как CREATE PROCEDURE заявление.


Я хотел уточнить некоторые больше пользы между ; и /

в SQLPLUS:

  1. ; означает "завершить текущий оператор, выполнить его и сохранить в буфер SQLPLUS"
  2. <newline> после Д. М. Л. (выбора, обновления, вставки,...) оператор или некоторые типы операторов D. D. L (создание таблиц и представлений) (которые не содержат ;), это означает, сохранить оператор в буфер, но не запускать он.
  3. / после ввода оператора в буфер (с пустым <newline>) означает "запустить Д. М. Л. и Д. Д. Л. или PL/SQL в буфер.
  4. RUN или R - это команда sqlsplus для отображения / вывода SQL в буфер и его запуска. Он не завершит инструкцию SQL.
  5. / во время ввода D. M. L. или D. D. L. или PL / SQL означает " завершить текущий оператор, выполнить его и сохранить его в SQLPLUS буфер"

Примечание:, потому что ; используются для PL / SQL для завершения оператора ; не может использоваться SQLPLUS, чтобы означать "завершить текущий оператор, выполнить его и сохранить в буфер SQLPLUS", потому что мы хотим, чтобы весь блок PL/SQL был полностью в буфере, а затем выполнить его. PL / SQL блоки должны заканчиваться на:

END;
/

почти все развертывания Oracle выполняются через SQL * Plus (этот странный инструмент командной строки, который использует ваш DBA). И в SQL * Plus одинокая косая черта в основном означает "повторно выполнить последнюю команду SQL или PL / SQL, которую я только что выполнил".

посмотреть

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

эмпирическое правило было бы использовать Слэш с вещами, которые делают BEGIN .. END и где вы можете использовать CREATE OR REPLACE.

для вставки, которые необходимо уникальное использование

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>)

из моего понимания, все инструкции SQL не нуждаются в косой черте, поскольку они будут запускаться автоматически в конце точек с запятой, включая DDL, DML, DCL и TCL-операторы.

для других блоков PL/SQL, включая процедуры, функции, пакеты и триггеры, поскольку они являются несколькими линейными программами, Oracle нужен способ узнать, когда запускать блок, поэтому мы должны написать косую черту в конце каждого блока, чтобы позволить Oracle запустить его.


Я использую только косую черту один раз в конце каждого скрипта, чтобы сказать sqlplus, что нет больше строк кода. В середине сценария я не использую косую черту.