2015-02-02 2 views
0

Java 메소드에서 종료 코드를 다시 PL/SQL로 가져 오려고합니다. 항상 예외가있는 것처럼 보입니다. exceptio 이 무엇인지 어떻게 알 수 있습니까? 나는 12c에서 뛰고있다.자바에서 종료 코드를 다시 PL/SQL로 가져 오기

SQL> CREATE OR REPLACE JAVA SOURCE NAMED UTLCMD AS 
    2 import java.lang.Runtime; 
    3 public class UTLCMD 
    4 { 
    5  public static int execute(String command) 
    6  { 
    7   int exitCode = 0; 
    8 
    9   try 
10   { 
11    Runtime rt = java.lang.Runtime.getRuntime(); 
12    Process proc = rt.exec(command); 
13    exitCode = proc.waitFor(); 
14   } 
15   catch(Exception e) 
16   { 
17    System.out.println(e.getMessage()); 
18    exitCode = 12; 
19   } 
20 
21   return exitCode; 
22  } 
23 } 
24/

Java created. 

SQL> CREATE OR REPLACE FUNCTION JavaRunShellCommand(
    2  command IN VARCHAR2) 
    3  RETURN NUMBER 
    4 AS LANGUAGE JAVA 
    5  NAME 'UTLCMD.execute(java.lang.String) return oracle.sql.NUMBER'; 
    6/

Function created. 

다음은이 메소드를 호출 한 결과입니다.

SQL> VARIABLE n NUMBER; 
SQL> CALL JavaRunShellCommand('cmd.exe /C CALL C:\Users\pwatson\src\java\my.bat') INTO :n; 

Call completed. 

SQL> PRINT n 

     N 
---------- 
     12 

SQL> CALL JavaRunShellCommand('cmd.exe /C EXIT /B 3') INTO :n; 

Call completed. 

SQL> PRINT n 

     N 
---------- 
     12 

SQL> SELECT JavaRunShellCommand('cmd.exe /C CALL C:\Users\pwatson\src\java\my.bat') AS R FROM DUAL; 

     R 
---------- 
     12 

SQL> SELECT JavaRunShellCommand('cmd.exe /C EXIT /B 3') AS R FROM DUAL; 

     R 
---------- 
     12 
+1

'cmd.exe'에'dbms_java.grant_permission'을 실행 했습니까? 콘솔에 오류를 쓰고 있으므로 추적 파일을 확인해야합니다. 예외를 잡는 이유는 무엇입니까? 세션에 버블 링하는 것이 더 간단 할 수 있습니다. –

+1

반환 형식을 문자열로 변경하고 예외 메시지를 반환합니다. – OldProgrammer

답변

0

oracle.exe가 machine \ oracle 사용자로 실행 중이며 내 디렉토리에 권한이 없으므로 문제가 발생합니다. 모든 것을 C : \ app \ oracle \ product \ 12.1.0 \ dbhome_1 \ BIN으로 옮길 때 예상대로 작동하기 시작했습니다. 이 솔루션은 Oracle Community 사이트에서 제공되었습니다. https://community.oracle.com/thread/3669270

많은 분들께 감사드립니다.

2

당신이 (12) 등을 받고있어 이후 당신은 예외를 얻고있다,하지만 당신은 모든 예외를 트래핑 만 System.out.println()로 표시하고, Java 콘솔 출력이 추적 파일로 전환된다 - 당신 (또는 DBA에게) 것 올바른 파일을 찾아 실제 오류를 추출해야합니다.

예외가 던져 질 수 있도록 간단 할 것이다 :

CREATE OR REPLACE JAVA SOURCE NAMED UTLCMD AS 
import java.lang.Runtime; 
public class UTLCMD 
{ 
    public static int execute(String command) 
    throws java.lang.InterruptedException, java.io.IOException 
    { 
     int exitCode = 0; 
     Runtime rt = java.lang.Runtime.getRuntime(); 
     Process proc = rt.exec(command); 
     exitCode = proc.waitFor(); 
     return exitCode; 
    } 
} 
/

나는 명령 (유닉스 y를 내 경우는) 다음 내가 진짜 문제 볼 것을 실행하는 경우 :

exec :n := JavaRunShellCommand('/bin/ls /tmp'); 

ORA-29532: Java call terminated by uncaught Java exception: java.security.AccessControlException: the Permission (java.io.FilePermission /bin/ls execute) has not been granted to STACKOVERFLOW. The PL/SQL to grant this is dbms_java.grant_permission('STACKOVERFLOW', 'SYS:java.io.FilePermission', '/bin/ls', 'execute') 
ORA-06512: at "STACKOVERFLOW.JAVARUNSHELLCOMMAND", line 1 
ORA-06512: at line 1 
29532. 00000 - "Java call terminated by uncaught Java exception: %s" 
*Cause: A Java exception or error was signaled and could not be 
      resolved by the Java code. 
*Action: Modify Java code, if this behavior is not intended. 

내 방식대로 시도 할 때 추적 파일에서 본 것과 동일하지만 액세스하기가 쉽습니다. 나는 오류가 유용하게, 그리고 다시 연결하라고의 (a DBA 등) dbms_java.grant_permission() 호출을 실행하여 내 문제를 해결하는 경우

, 지금은 작동합니다

exec :n := JavaRunShellCommand('/bin/ls /tmp'); 
anonymous block completed 

print n 
N 
- 
0 

은 물론 당신이 잘 다른를 받고 수 있습니다 예외는 아니지만 실제 문제를 해결하기 전에 무엇인지 알아야합니다.

+0

가장 우수! 많은 감사합니다. – lit

+0

죄송합니다. 나는 곧 조금 말했다. my.bat 스크립트는 종료 코드 7과 함께 종료되지만, 항상 1이 리턴됩니다. C : \ Users \ pwatson \ src \ java> my.bat를 입력하십시오. @echo off echo now exit/b 7 – lit

+0

0이 아닌 1을 반환합니까? <> '/ c' 스위치로도? 나는'cmd.exe' 자체가 오류가 아니라 스위치가 아닌 것으로 기대할 수 있습니다. 나는 생각한다. 'cmd.exe'를 실행해야합니까, 아니면 exec 호출에서 직접'my.bat'를 호출 할 수 있습니까? (이것은 실제로 내 영역이 아닙니다. * 8-) –