Когда мне нужно использовать точку с запятой против косой черты в 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:
-
;
означает "завершить текущий оператор, выполнить его и сохранить в буфер SQLPLUS" -
<newline>
после Д. М. Л. (выбора, обновления, вставки,...) оператор или некоторые типы операторов D. D. L (создание таблиц и представлений) (которые не содержат;
), это означает, сохранить оператор в буфер, но не запускать он. -
/
после ввода оператора в буфер (с пустым<newline>
) означает "запустить Д. М. Л. и Д. Д. Л. или PL/SQL в буфер. -
RUN
илиR
- это команда sqlsplus для отображения / вывода SQL в буфер и его запуска. Он не завершит инструкцию SQL. -
/
во время ввода 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, которую я только что выполнил".
посмотреть
эмпирическое правило было бы использовать Слэш с вещами, которые делают 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, что нет больше строк кода. В середине сценария я не использую косую черту.