Intereting Posts
Столбец «mary» не существует Разделение строки на несколько строк в Oracle ошибка импорта данных из файла csv в базу данных IBM netezza sql connect by clause в regex_substr Как найти счет нескольких записей с разными условиями, в которых условия из одной таблицы с многозначными полями УДАЛИТЬ все повторяющиеся темы с несколькими условиями Удалите все строки, кроме одного с наибольшим значением для каждой группы Как установить отношение 1 к 0 … 1 в SQL Server Management Studio ВЫБРАТЬ все новое ключевое слово с отличным от нуля значением в одном столбце Что такое «Структурировано» на языке структурированных запросов? Экземпляр объекта ObjectContext был удален и больше не может использоваться для операций, требующих подключения. в справочной таблице Оптимизация простого выбора mysql на большой таблице (75M + строк) mysql дублирует с LOAD DATA INFILE Ошибка SQL: ORA-02291: ограничение целостности Доступ: группировка по самой последней дате в записи (вложенный запрос)

Проблема с запуском скрипта 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 

Есть идеи? Благодарю.

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

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

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

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

> @doit.sql

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

71:

Нажатие ввода в этот момент вернется

72:

Мы смогли получить эти сценарии, выполнив ввод / в командной строке и нажав enter.

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

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

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

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

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

 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 во входном потоке.