2017-04-02 4 views
1

java 소스를로드 할 때 pl/sql에서 일부 Java 함수를 래핑하려고했지만 for-loops에서 콜론 문자에 ORA-29536이 발생했습니다.
필자는 콜론을 잘못 해석하고 바인딩하려고 시도하지 않았고 앞으로의 경로에 대한 제안을 얻지 못했기 때문에 왜 데이터베이스에 문제가 있는지 이해하고 싶었습니다.
모든 for-loops를 제거하기 위해 소스를 리팩터링하는 것을 피하고 가능한 경우 loadjava 도구를 사용하지 않으려합니다.
데이터베이스는 12cR1이고 ojdk는 1.6.0_71입니다.데이터베이스에 DDL 로딩 Java 소스에 대한 ORA-29536

다음은 예입니다.
을 감안할 때이 두 가지 사소한 안녕하세요 세계 형 클래스 :

public final class HelloWorld { 
    public static String greet(final String userName) { 
     return "Hello " + userName; 
    } 
} 

그리고 : 나는 데이터베이스에 컴파일 할 때, 첫 번째 미세에 가서 등록

import java.util.Arrays; 
import java.util.List; 

public final class LoopingTest { 
    public static String greet(final String userName) { 
     final List<String> emptyList = Arrays.asList(userName); 
     for (final String string : emptyList) { 
      System.out.println(string); 
     } 
     return "Hello " + userName; 
    } 
} 

JAVA SOURCEJAVA CLASS이 확인 오브젝트 (I 최종 타겟이> 32K 문자 이상이고, @, & 등과 같이 원시 스크립트에서 이스케이프 처리를 복잡하게하기 때문에 동적 SQL과 clob을 사용합니다.

BEGIN 
    EXECUTE IMMEDIATE 
    ' 
     CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "HelloWorld" AS 
     public final class HelloWorld { 
      public static String greet(final String userName) { 
       return "Hello " + userName; 
      } 
     } 
    '; 
END; 
/

PL/SQL procedure successfully completed. 

그러나 두 번째는 가져올 실패

내가 어떤 변화가 있는지 내가 로딩이에 오라클을 동축 케이블 만들 수 있습니다 궁금
BEGIN 
    EXECUTE IMMEDIATE 
    ' 
     CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "HelloWorld" AS 
     import java.util.Arrays; 
     import java.util.List; 

     public final class LoopingTest { 
      public static String greet(final String userName) { 
       final List<String> emptyList = Arrays.asList(userName); 
       for (final String string : emptyList) { 
        System.out.println(string); 
       } 
       return "Hello " + userName; 
      } 
     } 
    '; 
END; 
/

ERROR at line 1: 
ORA-29536: badly formed source: Encountered "final String string :" at line 1, 
column 195. 

.
loadjava를 사용하는 것이 가져올 수있는 유일한 방법 인 경우 받아 들일 수 있지만 가능하면 한 단계 DDL로로드하는 것이 좋습니다. 감사합니다

+1

11gR2 (1.5.0_51)에서는 전체 오류 메시지가 예상대로 일반 '문자열'을 나열하지 않지만 '최종 문자열'을 좋아하지 않는 것으로 보입니다. '키워드가 삭제되었습니다. 지금 당장 12c에서 검사 할 수 없네. 너도 마찬가지야? –

+0

감사합니다. @AlexPoole 재미 있습니다. 최종 키워드를 없애면 슬프지만 실용적인 타협이 될 수 있습니다. 나는 몇 시간 동안 내 컴퓨터에서 떨어져 있지만, 12c가 11g와 똑같은지 여부를 확인합니다. – alexgibbs

+0

@AlexPoole 물론, 12c에서도 성공적으로로드하기 위해 필요한 유일한 변경은 'final'한정자를 루프에 놓는 것입니다. 내가 '최종'에서 약간 당혹스러워서 문제를 일으킨다는 사실은 분명하지만, 왜 여기서 '최종'이 지원되지 않는지에 대한 흥미로운 배경이 있습니다.이 장애물을 없애줍니다. 근원적 ​​인 원인에 대한 해답과 가능한 길을 전하는 것으로 받아 들일 것입니다. 봐 주셔서 감사합니다. – alexgibbs

답변

1

오라클은 for-each 루프에서 final String string을 문제로 표시하는 Java 코드에서 일부 이상한 사전 처리를 수행하는 것으로 보입니다. 이 오류는 Java 컴파일러에서 제공되지 않습니다. 예상 한대로 유효합니다. My Oracle Support를 포함하여이 문제와 관련하여 아무 것도 볼 수 없습니다.

@JonHeller가 편집 주석에 언급 한 것처럼 문자열 연결과 관련된 것은 아니지만 동적 SQL과 관련이 없습니다. 11gR2에서 여전히 동일한 ORA-29536 오류가 표시됩니다. 두 번째 코드 블록을 사용하여 SQL 프롬프트에서 DDL을 직접 실행하면됩니다.

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "LoopingTest" AS 
import java.util.Arrays; 
import java.util.List; 

public final class LoopingTest { 
    public static String greet(final String userName) { 
     final List<String> emptyList = Arrays.asList(userName); 
     for (final String string : emptyList) { 
      System.out.println(string); 
     } 
     return "Hello " + userName; 
    } 
} 
/

Error report - 
ORA-29536: badly formed source: Encountered "final String string :" at line 7, column 14. 
Was expecting one of: 
    "boolean" ... 
... 

해결 방법으로 당신은 단지 final 키워드를 제거 할 수 있습니다

DECLARE 
    V_SQL_TEXT CLOB := ' ' || 
        'CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "LoopingTest" AS ' || 
        'import java.util.Arrays; ' || 
        'import java.util.List; ' || 
        ' ' || 
        'public final class LoopingTest { ' || 
        'public static String greet(final String userName){ ' || 
        'final List<String> emptyList = Arrays.asList(userName); ' || 
        -- remove 'final' to avoid ORA-29536 
        -- 'for (final String string : emptyList){ ' || 
        'for (String string : emptyList){ ' || 
        'System.out.println(string); ' || 
        '} ' || 
        'return "Hello " + userName; ' || 
        '} ' || 
        '} '; 
BEGIN 
    EXECUTE IMMEDIATE V_SQL_TEXT; 
END; 
/

PL/SQL procedure successfully completed. 

당신은 오라클 서비스 요청을 제기 고려해야합니다

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "LoopingTest" AS 
import java.util.Arrays; 
import java.util.List; 

public final class LoopingTest { 
    public static String greet(final String userName) { 
     final List<String> emptyList = Arrays.asList(userName); 
     // remove 'final' to avoid ORA-29536 
     // for (final String string : emptyList) { 
     for (String string : emptyList) { 
      System.out.println(string); 
     } 
     return "Hello " + userName; 
    } 
} 
/

Java source LoopingTest compiled 

또는 원래의 PL/SQL 코드에서

문제를 설명 및/또는 해결할 수 있는지 확인하십시오.

+0

감사합니다. Alex. 좋은 제안; 나는 오라클에서 철저히 조사 할 것이다. 흥미로운 점이 있다면 여기에서 업데이트하겠습니다. – alexgibbs

+0

여기에서 후속 조치를 취하십시오. SR이 오라클에 있으며 검토 중입니다. 그것이 올 때 나는 설명으로 갱신 할 것이다. – alexgibbs