Проблема с запуском сценария 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', 'test@test.com',' ');
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
какие идеи? Спасибо.
6 ответов
вам нужно либо поставить exit
в конце скрипта, или запустить его как sqlplus username/password@server/dbname < Setup.sql
(т. е. перенаправление ввода, <
вместо @
). Вы можете проверить, если это проблема, просто набрав "выход" в висячем сеансе.
если он действительно висит, вы совершили или откатили выполнение от разработчика?
Я видел эту проблему также с некоторыми скриптами, которые будут выполняться нормально в клиенте, таком как жаба, но при выполнении через sqlplus с директивой @script вместо зависания клиент SQLPlus вернет приглашение с номером на нем, который соответствует количеству строк в выполняемом скрипте (+1).
например, если мы выполнили скрипт с именем 'doit.sql', который имел 70 строк, мы бы начали SQLPlus с соответствующей команды и введите:
> @doit.sql
тогда мы увидим:
71:
нажатие enter в этой точке вернет
72:
мы смогли выполнить эти скрипты, введя /
в командной строке и нажав enter.
простой ответ
убедитесь, что вы поставили оба "конец"; и в последней строке поставить"/"
Он будет работать с легкостью.
командная строка
sqlplus username/password@server/dbname @Setup.sql
упомянутое выше означает, что sqlplus
должен выполнить скрипт Setup.sql
и ждать дальнейших команд в интерактивном режиме (если скрипт не делает exit
явно). Это нормальное поведение sqlplus
.
sqlplus
завершается в трех случаях:
- сбой (для некоторых ошибок вы можете изменить, если он завершается или нет. См.
WHENEVER
plsql-command) - явно
exit
(как интерактивные, так и sript) - конец 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
на входе поток.
проблема заключается в том, что SQLplus работает из дома клиента oracle, и он сбой при запуске команды обновления при запуске.
запустите sqlplus из неклиентского oracle home и попробуйте команды, затем он работает так, как ожидалось. таким образом, разрешение заключается в запуске sqlplus из основного дома oracle вместо дома клиента oracle.