Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Это вопрос предпочтения, но я предпочитаю видеть сценарии, которые последовательно используют косую черту - таким образом, все «единицы» работы (создание объекта PL / SQL, запуск анонимного блока PL / SQL и выполнение оператора DML )
Кроме того, если вы в конечном итоге перейдете к чему-то вроде Ant для развертывания, это упростит определение целей, чтобы иметь постоянный разделитель инструкций.
Насколько я понимаю, все инструкции SQL не нуждаются в косой черте, поскольку они будут выполняться автоматически в конце точек с запятой, включая DDL, DML, DCL и TCL.
Для других блоков PL / SQL, включая процедуры, функции, пакеты и триггеры, поскольку они представляют собой несколько линейных программ, Oracle необходимо знать, когда запускать блок, поэтому нам нужно написать косую черту в конце каждого блока, чтобы позволить Oracle запустить его.
Я знаю, что это старый поток, но я просто наткнулся на него, и я чувствую, что это не объяснено полностью.
В SQL * Plus существует огромная разница между значением функции /
и ;
, потому что они работают по-другому.
;
завершает инструкцию SQL, тогда как /
выполняет все, что находится в текущем «буфере». Поэтому, когда вы используете ;
и /
, оператор фактически выполняется дважды.
Вы можете легко увидеть, что с помощью /
после запуска инструкции:
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
.
;
), вам нужно найти способ указать альтернативный разделитель
– a_horse_with_no_name
10 April 2018 в 20:09
Я использую только одну косую черту в конце каждого скрипта, чтобы сказать sqlplus, что больше строк кода нет. В середине скрипта я не использую косую черту.
Я хотел уточнить некоторое использование между ;
и /
. В 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 должны заканчиваться:
END;
/