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

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

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

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

Я знаю, что это старый поток, но я просто наткнулся на него, и я чувствую, что это не объяснено полностью.

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

; завершает инструкцию 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 script, как это:

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.

Ответ 3

Я хотел прояснить некоторое использование между ; и /

В SQLPLUS:

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

ПРИМЕЧАНИЕ.. Поскольку ; используются для PL/SQL для завершения оператора ;, SQLPLUS не может использоваться, чтобы означать "завершение текущего оператора, его выполнение и сохранение его в SQLPLUS buffer", потому что мы хотим, чтобы весь блок PL/SQL полностью находился в буфере, а затем выполнил его. Блоки PL/SQL должны заканчиваться:

END;
/

Ответ 4

Почти все развертывания Oracle выполняются с помощью SQL * Plus (этот странный инструмент командной строки, который использует ваш администратор базы данных). И в 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>)

Ответ 5

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

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

Ответ 6

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