SQL create user - отсутствует или недопустимая опция [duplicate]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

151
задан a_horse_with_no_name 3 January 2015 в 11:39
поделиться

7 ответов

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

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

28
ответ дан dpbradley 17 August 2018 в 18:25
поделиться

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

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

21
ответ дан Anik Islam Abhi 17 August 2018 в 18:25
поделиться

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

В 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.

272
ответ дан a_horse_with_no_name 17 August 2018 в 18:25
поделиться
  • 1
    @amis, я новичок в Oracle и вхожу в ту же проблему. Этот вопрос очень полезен, но все ответы дали объяснение «почему», а не «лучший способ». работать или каким-то образом обходить это. Итак, если я правильно понял, нет никакого способа иметь только один скрипт и держать его пригодным для использования всеми инструментами ... или вы обнаружите какой-то способ? – ceinmart 21 November 2013 в 16:08
  • 2
    @ceinmart: «лучший способ». состоит в том, чтобы определить один (и только один) инструмент для выполнения SQL-скриптов - и "правильность" скрипта проверяется с помощью этого инструмента. Подобно тому, как у вас есть один компилятор для вашего языка программирования или одна конкретная версия среды выполнения (Java 7, .NET 4.0, PHP 5.x, ...) – a_horse_with_no_name 21 November 2013 в 16:49
  • 3
    Хороший ответ. Является ли это только я или Oracle глупым и архаичным по сравнению с другими БД? Я использовал много Sybase и кажется гораздо более интуитивным. – splashout 10 April 2018 в 19:47
  • 4
    @splashout: ну, если вы хотите запускать инструкции, содержащие разделитель по умолчанию (;), вам нужно найти способ указать альтернативный разделитель – a_horse_with_no_name 10 April 2018 в 20:09

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

2
ответ дан Jonathan 17 August 2018 в 18:25
поделиться
  • 1
    Итак, заказываете ли вы вещи, требующие / (например, подпрограммы и триггеры) в конце? Что делать, если у вас есть несколько триггеров? Я проверил тест и выполнил только первый, если у него нет / между каждым. Я что-то упускаю? – amischiefr 3 July 2009 в 17:34
  • 2
    Я стараюсь избегать его (если это возможно), но если я не могу (например, в триггерах), я использую точки с запятой и слэши точно так же, как они используются в официальных сценариях, которые генерируют схемы выборок oracle: download.oracle. com / docs / cd / B19306_01 / server.102 / b14198 / & hellip; Для проблемы с вставками я пытаюсь отделить сценарии, создающие объекты от тех, кто заполняет таблицы. – Jonathan 3 July 2009 в 20:12
  • 3
    Извините, но это не отвечает на вопрос. – DerMike 2 June 2017 в 13:03

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

. В SQLPLUS:

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

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

END;
/
64
ответ дан Mr_Moneybags 17 August 2018 в 18:25
поделиться
21
ответ дан Anik Islam Abhi 6 September 2018 в 12:02
поделиться
22
ответ дан Anik Islam Abhi 29 October 2018 в 18:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: