На этой неделе в моей компании велись споры о том, как нам писать наши сценарии SQL.
История вопроса: наша база данных - Oracle 10g (скоро обновится до 11). Наша команда администраторов баз данных использует 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, следует ли вам всегда использовать /
?
sqlterminator
его,!
если хотите), и этому соглашению обычно следуют другие инструменты. Однако язык PL / SQL использует точки с запятой в качестве обязательного элемента синтаксиса.Ответы:
Это вопрос предпочтений, но я предпочитаю видеть сценарии, которые последовательно используют косую черту - таким образом все «единицы» работы (создание объекта PL / SQL, запуск анонимного блока PL / SQL и выполнение оператора DML) могут быть выбрано легче на глаз.
Кроме того, если вы в конечном итоге перейдете к развертыванию, например Ant, это упростит определение целей, чтобы иметь согласованный разделитель операторов.
источник
/
или не;
видит ответ @a_horse_with_no_name или @Mr_Moneybags для большего контекстаЯ знаю, что это старая ветка, но я наткнулся на нее и чувствую, что это не объяснено полностью.
В SQL * Plus существует огромная разница между значениями a
/
и a,;
потому что они работают по-разному.В
;
Завершает SQL заявление, в то время как/
выполняет все , что находится в текущем «буфер». Поэтому, когда вы используете a;
и a,/
оператор фактически выполняется дважды.Вы можете легко увидеть это с помощью оператора
/
после выполнения:В этом случае действительно замечают ошибку.
Но при условии, что есть сценарий SQL, подобный этому:
И это запускается из SQL * Plus, тогда это будет очень запутанным:
В
/
основном требуется для запуска операторов, которые встроены;
какCREATE PROCEDURE
оператор.источник
;
), вам нужно найти способ указать альтернативный разделительЯ хотел бы уточнить еще некоторые используют между
;
и/
В SQLPLUS:
;
означает «завершить текущий оператор, выполнить его и сохранить в буфере SQLPLUS»<newline>
после оператора DML (SELECT, UPDATE, INSERT, ...) или некоторых типов операторов DDL (создание таблиц и представлений) (которые не содержат;
) это означает, что оператор сохранится в буфере, но не будет выполняться./
после ввода оператора в буфер (с пробелом<newline>
) означает «запустить DML или DDL или PL / SQL в буфере.RUN
илиR
является командой sqlsplus, чтобы показать / вывести SQL в буфере и запустить его. Это не приведет к завершению оператора SQL./
во время ввода DML или DDL или PL / SQL означает «завершить текущий оператор, выполнить его и сохранить в буфере SQLPLUS»ПРИМЕЧАНИЕ. Поскольку
;
для PL / SQL используется завершение оператора;
, SQLPLUS не может означать «завершить текущий оператор, выполнить его и сохранить в буфере SQLPLUS», поскольку мы хотим, чтобы весь блок PL / SQL был полностью в буфер, затем выполните его. Блоки PL / SQL должны заканчиваться:источник
Почти все развертывания Oracle выполняются через SQL * Plus (это странное маленькое средство командной строки, которое использует ваш администратор баз данных). А в SQL * Plus косая черта в основном означает «повторно выполнить последнюю команду SQL или PL / SQL, которую я только что выполнил».
Видеть
Эмпирическое правило будет использовать косую черту с вещами, которые делают
BEGIN .. END
или где вы можете использоватьCREATE OR REPLACE
.Для вставок, которые должны быть уникальным использованием
источник
Насколько я понимаю, все операторы SQL не нуждаются в прямом слэше, так как они будут выполняться автоматически в конце точки с запятой, включая операторы DDL, DML, DCL и TCL.
Для других блоков PL / SQL, включая процедуры, функции, пакеты и триггеры, поскольку они являются многострочными программами, Oracle нужен способ узнать, когда запускать блок, поэтому мы должны написать косую черту в конце каждого блока, чтобы пусть Oracle его запустит.
источник
Я использую косую черту только один раз в конце каждого скрипта, чтобы сообщить sqlplus, что строк кода больше нет. В середине сценария я не использую косую черту.
источник