问题描述:
我通过程序,自动生成了一个批处理文件。
批处理文件内容为:
@echo off
SQLPlus
用户名/用户密码@数据库名称
.
.
.
.
.
.
我的目的是通过执行我的批处理文件,自动连接到SQLPlus,并在里面执行我的操作,而实际在执行批处理文件时,停在了“请输入用户名”,如何实现在我的批处理文件里就连上了SQLPlus而不出现这个提示。请高手们赐教!
13 个解决方案
谢谢楼上的wohow()。
改成:
@echo off
SQLPlus 用户名/用户密码@数据库名称
select count(*) from 表名;
如何执行批处理文件后直接看到其执行SQL语句后而不是要输入执行语句呢?
我的意思是:我做了一个加密小工具,对Oracle过程包(含过程、函数、触发器)进行加密(加密机制采用oracle带的wrap工具加密),加密是通过对要加密的文件自动写成批处理文件后,并执行产生加密文件。
而要在工具里自动编译运行加密后的文件(当然可以手工在PLSQL里去编译),我的思路是对要编译的加密文件存成批处理文件后并执行,达到在SQLPlus里自动编译的效果。
批处理文件存成的格式为:
@echo off
SQLPlus 用户名/用户密码@数据库名称
@文件名1;
@文件名n;
但执行批处理文件时到“SQLPlus 用户名/用户密码@数据库名称
”就停住了,并未执行“@文件名1;”……“@文件名1;”。
请各位高手提供好的实现方式,谢谢。
搞定了,那把解决方法公布以下,说不定版主给弄成精华帖呢?
同时别人也可借鉴吗!!!
批处理文件,窗口中显示
完整代码示例:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------
String ExecuteApp(String sCmdline,TMemo *MyMemo)
{
PROCESS_INFORMATION proc = {0};
long ret;//,k=1
bool bret;
STARTUPINFO start = {0};
SECURITY_ATTRIBUTES sa = {0};
HANDLE hReadPipe ;
HANDLE hWritePipe;
String sOutput;
String sBuffer;
unsigned long lngBytesRead;
char cBuffer[257];
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor=0;
sa.bInheritHandle = TRUE;
bret =::CreatePipe(&hReadPipe, &hWritePipe,&sa, 0);
if (!bret)
{
sOutput="CreatePipe failed. Error: " + String(GetLastError());
MyMemo->Lines->Add(sOutput);
return sOutput;
}
start.cb = sizeof(STARTUPINFOA);
start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
start.hStdOutput = hWritePipe;
start.hStdError = hWritePipe;
start.wShowWindow = SW_HIDE;
sBuffer = sCmdline;
ret =::CreateProcess(0, sBuffer.c_str(), &sa, &sa, TRUE, NORMAL_PRIORITY_CLASS, 0, 0, &start, &proc);
if (ret == 0)
{
sOutput="Bad command or filename";
MyMemo->Lines->Add(sOutput);
return sOutput;
}
::CloseHandle(hWritePipe);
do
{
memset(cBuffer,'\0',sizeof(cBuffer));
ret = ::ReadFile(hReadPipe, &cBuffer, 256, &lngBytesRead, 0);
sBuffer=StrPas(cBuffer);
sOutput = sOutput + sBuffer;
MyMemo->Text=MyMemo->Text+sBuffer;
Application->ProcessMessages();
} while (ret != 0 );
::CloseHandle(proc.hProcess);
::CloseHandle(proc.hThread);
::CloseHandle(hReadPipe);
return sOutput;
}
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//ExecuteApp("ping 127.0.0.1",Memo1);
ExecuteApp("DirCD.bat",Memo1);
}
//---------------------------------------------------------------------------
主要输入
我在windows没有试过,但在unix下是这样的:
sqlplus <<!
@fileName.sql
!
sqlplus <<!
spool a.txt
select to_char(sysdate,'yyyymmddhh24miss') from dual
!
你试试吧,我没有进行测试。随便写的。
呵呵~~~接分
我在windows没有试过,但在unix下是这样的:
sqlplus UserName/password@ServerName <<!
@fileName.sql
!
sqlplus UserName/password@ServerName <<!
spool a.txt
select to_char(sysdate,'yyyymmddhh24miss') from dual
!
你试试吧,我没有进行测试。随便写的。
呵呵~~~接分
我在windows没有试过,但在unix下是这样的:
sqlplus UserName/password@ServerName <<!
@fileName.sql
exit
!
sqlplus UserName/password@ServerName <<!
spool a.txt
select to_char(sysdate,'yyyymmddhh24miss') from dual
exit
!
你试试吧,我没有进行测试。随便写的。
呵呵~~~接分