Проблема с запуском скрипта oracle из командной строки с использованием sqlplus

У меня возникла проблема при попытке запустить мой sql-скрипт в oracle с помощью sqlplus. Скрипт просто заполняет фиктивные данные:

DECLARE 
  role1Id NUMBER;
  user1Id NUMBER;
  role2Id NUMBER;
  user2Id NUMBER;
  role3Id NUMBER;
  user3Id NUMBER;
  perm1Id NUMBER;
  perm2Id NUMBER;
  perm3Id NUMBER;
  perm4Id NUMBER;
  perm5Id NUMBER;
BEGIN
  INSERT INTO PB_USER(USER_ID,USER_NAME, USER_EMAIL, USER_ACTIVEYN)
  VALUES(PB_USER_ID_SEQ.nextval, 'RoleDataManagerTests_Username', '[email protected]',' ');

  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 1');
  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 2');
  INSERT INTO ROLES(ROLE_ID, ROLE_NAME)
  VALUES(PB_ROLE_ID_SEQ.nextval, 'Test role 3');

  SELECT ROLE_ID INTO role1Id FROM ROLES WHERE ROLE_NAME = 'Test role 1';
  SELECT USER_ID INTO user1Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user1Id, role1Id);

  SELECT ROLE_ID INTO role2Id FROM ROLES WHERE ROLE_NAME = 'Test role 2';
  SELECT USER_ID INTO user2Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user2Id, role2Id);

  SELECT ROLE_ID INTO role3Id FROM ROLES WHERE ROLE_NAME = 'Test role 3';
  SELECT USER_ID INTO user3Id FROM PB_USER WHERE USER_NAME = 'RoleDataManagerTests_Username';
  INSERT INTO USERS_ROLES(USER_ID, ROLE_ID) VALUES(user3Id, role3Id);

  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm1', 'permission 1');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm2', 'permission 2');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm3', 'permission 3');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm4', 'permission 4');
  INSERT INTO PERMISSIONS(PERMISSION_ID, KEY, DESCRIPTION)
  VALUES (PB_PERMISSION_ID_SEQ.nextval, 'perm5', 'permission 5');

  SELECT PERMISSION_ID INTO perm1Id FROM PERMISSIONS WHERE KEY = 'perm1';
  SELECT PERMISSION_ID INTO perm2Id FROM PERMISSIONS WHERE KEY = 'perm2';
  SELECT PERMISSION_ID INTO perm3Id FROM PERMISSIONS WHERE KEY = 'perm3';
  SELECT PERMISSION_ID INTO perm4Id FROM PERMISSIONS WHERE KEY = 'perm4';
  SELECT PERMISSION_ID INTO perm5Id FROM PERMISSIONS WHERE KEY = 'perm5';

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm1Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm2Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role1Id, perm3Id);

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role2Id, perm3Id);

  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role3Id, perm4Id);
  INSERT INTO ROLES_PERMISSIONS(ROLE_ID, PERMISSION_ID)
  VALUES(role3Id, perm5Id);
END;
/

Мой сценарий отлично работает, когда я запускаю его с помощью Oracle SQL Developer, но когда я использую инструмент командной строки sqlplus, это то, что выводится, а затем он просто зависает:

SQL*Plus: Release 11.1.0.7.0 - Production on Tue May 11 09:49:34 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining Scoring Engine
and Real Application Testing options

Я запускаю инструмент, используя эту командную строку, которая отлично работает с другими скриптами:

sqlplus username/password@server/dbname @Setup.sql

Любые идеи? Спасибо.


person Charlie    schedule 11.05.2010    source источник
comment
что происходит, когда вы подключаетесь к своей базе данных через sqlplus, а затем в командной строке вызываете скрипт?   -  person akf    schedule 11.05.2010


Ответы (6)


Вам нужно либо поместить exit в конец скрипта, либо запустить его как sqlplus username/password@server/dbname < Setup.sql (т.е. перенаправленный ввод, < вместо @). Вы можете проверить, не в этом ли проблема, просто набрав «exit» в сеансе зависания.

Если он действительно зависает, вы зафиксировали или откатили выполнение от разработчика?

person Alex Poole    schedule 11.05.2010
comment
даже без exit, он должен делать что-то, т. е. завершать и отображать подсказку. - person akf; 11.05.2010
comment
правда, я обычно бегаю с -s, когда делаю эту ошибку - person Alex Poole; 11.05.2010
comment
Да, извините по моей вине, это транзакция, которая не была совершена. Я впервые использовал oracle или любой из этих инструментов! - person Charlie; 11.05.2010
comment
для меня это просто выводит на экран кучу чисел. Есть идеи, о чем это ?! Они в основном увеличиваются до номера строки, но записываются в матрицу - person JonnyRaa; 29.11.2013
comment
@JonnyLeeds - если у вас нет -s в командной строке, вы увидите номера строк скрипта. Вы останетесь в пронумерованной подсказке; если при нажатии return генерируется новое число, вы пишете блок PL / SQL, иначе вы получите sql> приглашение. В любом случае вы не приказали ему выполнить. Вам нужен / сам по себе в строке после финального end блока. - person Alex Poole; 30.11.2013
comment
спасибо, это полезно знать. В этот момент у меня было другое поведение, выполняемое вручную из командной строки и запускаемое из командной строки по сценарию. - person JonnyRaa; 02.12.2013

Я также видел эту проблему с некоторыми сценариями, которые нормально выполнялись бы в таком клиенте, как TOAD, но при выполнении через SQLPlus с директивой @script вместо зависания клиент SQLPlus возвращал приглашение с номером на нем, который соответствовал количество строк в исполняемом скрипте (+1).

Например, если бы мы выполнили сценарий с именем doit.sql, который содержит 70 строк, мы запустим SQLPlus с соответствующей командой и введем:

> @doit.sql

Тогда мы увидим:

71:

Нажатие Enter в этот момент вернет

72:

Мы смогли запустить эти сценарии, введя / в командной строке и нажав клавишу ВВОД.

person Community    schedule 05.07.2011
comment
У меня было подобное, висело только число, которое я мог увеличивать, нажимая Enter. Я перенаправил свой сценарий в свою команду SQLPlus, используя < вместо @, и сценарий завершился и вернулся в командную строку в соответствии с предложением в сообщение @ alex-poole выше. К сожалению, я не мог просто добавить EXIT, так как мой импорт привел к ряду сторонних скриптов, которые были доступны всему бизнесу в нашем репозитории кода. - person Big Rich; 01.12.2016

Простой ответ

Убедитесь, что вы поставили оба 'end;' и в последней строке поставьте '/'

Он будет работать с легкостью.

person Viren    schedule 09.04.2013
comment
исправил это для меня. - person Yoav24; 06.03.2018
comment
@ Yoav24 тоже для меня. Oracle ... безнадежно. - person RonJohn; 31.03.2021

Командная строка

sqlplus username/password@server/dbname @Setup.sql

упомянутое выше означает, что sqlplus должен выполнять сценарий Setup.sql и ожидать дальнейшие команды в интерактивном режиме (если сценарий не выполняет exit явно). Это нормальное поведение sqlplus.

sqlplus оканчивается в трех случаях:

  • Сбой (для некоторых ошибок вы можете изменить, завершается он или нет. См. WHENEVER plsql-command)
  • Явный exit (как интерактивный, так и скриптовый)
  • Конец STDIN (EOF)

Либо из интерактивного режима, либо из сценария вы можете отправить символ ^Z, чтобы мягко завершить входной поток. В интерактивном режиме вы просто нажимаете Ctrl+Z,Enter.

И, конечно, вы можете перенаправить STDIN и взять его из файла, а не с клавиатуры. Это можно сделать двумя похожими способами:

1) sqlplus username/password@server/dbname<Setup.sql
2) echo @Setup.sql|sqlplus username/password@server/dbname

В обоих случаях sqlplus завершится после выполнения сценария из-за EOF во входном потоке.

person Naeel Maqsudov    schedule 12.12.2017

Вместо использования / в приглашении убедитесь, что ваш запрос в doit.sql заканчивается точкой с запятой.

person sandrows    schedule 10.07.2012
comment
Это должен был быть комментарий к ответу cwash, но в любом случае он неверен; получение подсказок с номером строки указывает на то, что это был блок PL / SQL, для которого потребуется / (а также ;, который уже должен быть там, иначе он все равно не будет работать). - person Alex Poole; 11.07.2012

Проблема связана с тем, что SQLplus запускался из дома клиента oracle и давал сбой при запуске команды обновления при запуске.

Запустите sqlplus из неклиентского дома оракула и попробуйте команды, после чего он работает, как ожидалось. поэтому решение состоит в том, чтобы запустить sqlplus из главного дома оракула, а не из дома клиента оракула.

person PranavF    schedule 10.05.2018