SQL* Плюс скрипт выполняется дважды - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь запустить скрипт с использованием sqlplus. Мой скрипт - это простое заявление об удалении. Я выполняю его, помещая в мой терминал k sh следующее:

sqlplus username/'password' @../sql/delete_societes.sql

.. / sql / delete_societes. sql is

DELETE FROM f2020.SOCIETES;
/

По какой-то причине он запускается дважды, в результате чего вывод «0 обнаруженных строк» ​​будет напечатан дважды и вызывает ошибки, когда я пытаюсь выполнить вставку вместо удаления.

Ответы [ 2 ]

7 голосов
/ 02 апреля 2020

Заставьте ваш скрипт сделать либо:

DELETE FROM f2020.SOCIETES
/

или

DELETE FROM f2020.SOCIETES;

без sla sh.

Из документации :

/ (sla sh)

Выполняет последнюю выполненную команду SQL или блок PL / SQL, который хранится в SQL buffer.

и далее в примере:

Введите sla sh (/) для повторного выполнения команды в буфере

... это именно то, что вы видите.

В других местах этих документов :

Точка с запятой (;) означает что это конец команды. Нажмите Return или нажмите Выполнить. SQL* Plus обрабатывает команду и отображает результаты

Как и многие клиенты SQL* Plus обрабатывает точку с запятой в конце вашего оператора SQL как разделитель операторов - это not часть самого оператора (что приводит к некоторой путанице, например, к вызовам dynamici c SQL и JDB C) - и когда он его видит, он выполняет команду. Выполненный оператор остается в буфере команд; и если вы list увидите текущий буфер команд, он не покажет эту точку с запятой. Когда вы запускаете sla sh, он снова выполняет буфер.


В PL / SQL все немного иначе; там блок PL / SQL должен заканчиваться точкой с запятой, которая является частью блока и появляется в буфере. Вы должны использовать sla sh до выполнить PL / SQL блок .

0 голосов
/ 02 апреля 2020

Пример, где вы можете увидеть содержимое буфера sqlplus для SQL и PL SQL.

me@XEPDB1> help run

 RUN
 ---

 Lists and executes the most recently executed SQL command or
 PL/SQL block which is stored in the SQL buffer. The buffer has
 no command history list and does not record SQL*Plus commands.

 R[UN]


me@XEPDB1> help /

 / (slash)
 ---------

 Executes the most recently executed SQL command or PL/SQL block
 which is stored in the SQL buffer. Use slash (/) at the command
 prompt or line number prompt in SQL*Plus command line. The buffer
 has no command history and does not record SQL*Plus commands.

 /

me@XEPDB1> clear buffer                                                                                                                                           [1/651]
buffer cleared
me@XEPDB1> l
SP2-0223: No lines in SQL buffer.
me@XEPDB1> select * from dual
  2  /

D
-
X                          

me@XEPDB1> l
  1* select * from dual                 
me@XEPDB1> select * from dual;

D                    
-           
X

me@XEPDB1> l
  1* select * from dual
me@XEPDB1> /         

D                                       
-
X          

me@XEPDB1> r
  1* select * from dual

D
-
X

me@XEPDB1> begin null; end;
  2  /

PL/SQL procedure successfully completed.

me@XEPDB1> l
  1* begin null; end;
me@XEPDB1> /

PL/SQL procedure successfully completed.

me@XEPDB1> r
  1* begin null; end;

PL/SQL procedure successfully completed.
...