2015-01-28 3 views
0

Как я могу вернуть USERNAME, PASSWORD и DATABASENAME INPUT при вводе недопустимых значений или когда SQL не подключался?Командная строка SQL недействительные учетные данные

Sample

После того, как изображение выше, командная строка будет просто закрыть.

Это пакетный (.bat) файл.

@echo off 

sqlplus /nolog @C:\Users\myuser\Desktop\conn.sql 

ECHO About to exit. 

timeout t/ 30 

:pause 

И это conn.sql файл

conn &&[email protected]&&DBNAME 


SPOOL C:\Sample.log 
SELECT 1 FROM DUAL/
SPOOL OFF 

EXIT 
+0

Какой же выход из 'ECHO о том, чтобы выйти% ERRORLEVEL% '? Скажем, '1017', если возникает ошибка _invalid credential_? Тогда 'if% errorlevel% EQU 1017 goto: back' может помочь – JosefZ

+0

Я не могу ECHO, потому что я пытаюсь подключиться через .SQL-файл. – ladiesman1792

+0

Im работает над чем-то, что выглядит следующим образом: '@echo от SQLPLUS && пользователя @ && дб/NoLog @C: \ Users \ njediaz \ Desktop \ conn.sql ECHO о том, чтобы выйти. timeout t/30 : pause' – ladiesman1792

ответ

0

Batch File

@echo off 
setlocal 
set "SqlUserName=" 
set "SqlPassword=" 
set "SqlDatabase=" 
:Credentials 
set /P "SqlUserName=Enter username: " 
set /P "SqlPassword=Enter password: " 
set /P "SqlDatabase=Enter database: " 
@(
echo whenever sqlerror exit failure 
echo connect %SqlUserName%/%SqlPassword%@%SqlDatabase% 
echo select * from dual; 
echo exit 
) | sqlplus.exe -s /nolog 
if errorlevel 1 goto Credentials 
if errorlevel 0 sqlplus /nolog @C:\Users\myuser\Desktop\conn.sql 
echo About to exit. 
timeout /t 30 
endlocal 

Conn.sql

SPOOL C:\Sample.log 
SELECT 1 FROM DUAL/
SPOOL OFF 

EXIT 

Благодаря MOFI и Алекс: How do I prompt input for database on command line?

2

Согласно Oracle 11g – SQLPlus Command Line Options и Starting SQLPlus, то можно указать имя пользователя, пароль и базу данных уже в командной строке sqlplus.exe.

Я не sqlplus.exe, чтобы проверить это, но что-то вроде ниже, должны работать с соответствующим содержанием приспосабливания файла conn.sql.

@echo off 
setlocal 
set "SqlUserName=" 
set "SqlPassword=" 
set "SqlDatabase=" 
:Credentials 
set /P "SqlUserName=Enter username: " 
set /P "SqlPassword=Enter password: " 
set /P "SqlDatabase=Enter database: " 
sqlplus.exe -L "%SqlUserName%/%SqlPassword%@%SqlDatabase%" /nolog @C:\Users\myuser\Desktop\conn.sql 
if errorlevel 1 goto Credentials 
echo About to exit. 
timeout /t 30 
endlocal 

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

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

Edit: Добавлен простой цикл в случае sqlplus.exe выходов с любым кодом больше или равно 1. Пользователь пакетного кода имеет возможность просто нажать клавишу RETURN или ENTER, чтобы использовать имя пользователя , пароль или имя базы данных, введенное ранее. Окончательное решение должно быть, скорее всего, лучше, чем то, что опубликовано здесь, так как ввод учетных данных еще раз должен выполняться только при ошибке доступа к базе данных, а не о других ошибках. Поэтому командные файлы должны различать различные коды выхода, возвращаемые SQL * PLUS.

Смотрите также ответы на переполнение стека вопросы Sql*plus always return exit code 0? и How do I capture a SQLPlus exit code within a shell script?

Единственное отличие состоит в том, что в сценарии оболочки Unix if [ $? != 0 ] эквивалентно if errorlevel 1 в пакетный файл Windows, (если код завершения не является отрицательным, который, как правило, верно). См. Статьи поддержки Microsoft Testing for a Specific Error Level in Batch Files и Correct Testing Precedence of Batch File ERRORLEVELs об оценке кодов выхода с помощью if errorlevel.

+0

Это не работает для меня. Командная строка по-прежнему закрывается после ввода неверных учетных данных. – ladiesman1792

+0

@ ladiesman1792 - флаг '-L' останавливает запрос SQL * Plus снова, но это, вероятно, то, что вы хотите, так как вы хотите получить три элемента отдельно, поэтому вам потребуется цикл в пакетном скрипте для повторного запуска и запуска. Однако включение учетных данных в командной строке не так безопасно, как они видны другим процессам. –

+0

Он не возвращается к ': Credentials'. Все еще закрывается при вводе недопустимых учетных данных. – ladiesman1792

Смежные вопросы