У нас были некоторые дебаты на этой неделе в моей компании относительно того, как мы должны писать наши 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 я не использую косую черту.