oracle spool脚本在cmd.exe中工作,但从代码调用时挂起

2cmtqfgy  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(249)

我正在尝试使用oracle的sqlcl以编程方式创建oracle数据转储文件。脚本如下所示:

SET SQLFORMAT XML

SPOOL 'ABC.XML'
SELECT * FROM ABC;
SPOOL OFF

SPOOL 'XYZ.XML'
SELECT * FROM XYZ;
SPOOL OFF

//MORE TABLES BELOW

命令如下所示:

exit | "path\to\sqlcl\folder\bin\sql.exe" username/password@connection_string @"path\to\data\dump\script\datadumpscript.sql"

通过在cmd(windows10)中执行命令,它可以正常工作。
执行逻辑的代码来自此线程,转换为vb.net:

Private Shared Sub ExecuteCommand(ByVal command As String)
    Dim exitCode As Integer
    Dim processInfo As ProcessStartInfo
    Dim process As Process
    processInfo = New ProcessStartInfo("cmd.exe", "/c """ & command & """")
    processInfo.CreateNoWindow = True
    processInfo.UseShellExecute = False
    processInfo.RedirectStandardError = True
    processInfo.RedirectStandardOutput = True
    process = Process.Start(processInfo)
    process.WaitForExit()
    Dim output As String = process.StandardOutput.ReadToEnd()
    Dim [error] As String = process.StandardError.ReadToEnd()
    exitCode = process.ExitCode
    System.Diagnostics.Debug.WriteLine("output>>" & (If(String.IsNullOrEmpty(output), "(none)", output)))
    System.Diagnostics.Debug.WriteLine("error>>" & (If(String.IsNullOrEmpty([error]), "(none)", [error])))
    System.Diagnostics.Debug.WriteLine("ExitCode: " & exitCode.ToString(), "ExecuteCommand")
    process.Close()
End Sub

当从代码中调用时,通过传入上面的命令,程序确实转到“process.waitforexit()”并阻塞,但只有spool脚本中的第一个文件被创建为大小为0的文件,该文件被java二进制文件锁定,之后什么也没有发生。导出过程似乎没有运行。
任何建议都将不胜感激。谢谢您。

vddsk6oq

vddsk6oq1#

创建一个存储过程/匿名pl/sql块,使用utl\u file实用程序将数据从表转储到文件将是另一种选择。下面的脚本是从表的一列中提取数据的基本脚本,但可以扩展到多个列或所有列。

DECLARE
  fhandle  utl_file.file_type;

BEGIN 

// File1
 BEGIN
  fhandle := utl_file.fopen(
                '/user/home'     -- Folder location or an Oracle directory
               , 'filename1.XML' -- File name
               , 'w' -- writemode Mode 
                  );

   FOR V1 IN (Select colA from TableA)
   LOOP 
    utl_file.put_line(fhandle, v1.COLA);
   END LOOP;
   utl_file.fclose(fhandle);
 exception
  when others then
    dbms_output.put_line('ERROR: ' || SQLCODE 
                      || ' - ' || SQLERRM);
    raise;
 end;

// File 2
BEGIN

  fhandle := utl_file.fopen(
                '/user/home'     -- Folder location or an Oracle directory
               , 'filename2.XML' -- File name
               , 'w' -- Write Mode 
                  );

   FOR V1 IN (Select colA from TableA)
   LOOP 
    utl_file.put_line(fhandle,v1.COLA);
   END LOOP;
   utl_file.fclose(fhandle);
 exception
  when others then
    dbms_output.put_line('ERROR: ' || SQLCODE 
                      || ' - ' || SQLERRM);
    raise;
 end;

END;
hrysbysz

hrysbysz2#

调整参数后,我发现 processInfo.UseShellExecute = True 修复了无法运行的问题。但是,通过这种方式,即使在 processInfo.CreateNoWindow = True .
我正在寻找一种方法来隐藏控制台窗口,但如果我不能它仍然是可以接受的。

相关问题