다른 데이터베이스 사용자로 Oracle에서 저장 프로 시저를 실행할 수 없음이 ora-00997 오류를 반환 함

구루 프라 사드

Oracle 데이터베이스에 데이터를
TABLE 유형 객체 로 반환하는 저장 프로 시저를 작성했습니다 . java.sql.Array 및 java.sql.Struct를 사용하여 Java 프로그램에서이 데이터를 읽었습니다.
이 저장 프로 시저를 데이터베이스 사용자 A로 만들었습니다.
이 저장 프로시 저는 제대로 작동하고 예상대로 데이터를 반환합니다.
java 프로그램은 사용자 A로 데이터베이스에 연결하고 저장 프로 시저에서 얻은 데이터를 읽을 수 있습니다.
Type 개체와 저장 프로 시저에 대한 공용 동의어가 만들어졌고 데이터베이스 사용자 그룹에 적절한 부여 권한이 부여되었습니다.

그러나 사용자 B (데이터베이스 사용자 그룹의 다른 유효한 데이터베이스 사용자 부분)로 데이터베이스에 연결하여 Java 프로그램을 실행하면 다음 예외가 발생합니다.

java.sql.SQLException: ORA-00997: illegal use of LONG datatype
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)  

execute ()를 성공적으로 호출 한 후 callablestatement에서 데이터를 가져올 때 위의 예외가 발생합니다.
하지만 SQL Plus 도구를 통해 저장 프로 시저를 실행할 수 있습니다 (사용자 B로 연결).
어떤 힌트 / 도움도 좋을 것입니다.

유형 정의는 다음과 같습니다.

CREATE TYPE gbm_test_type AS OBJECT
(
encounter_id NUMBER(12),
bed_number VARCHAR2(10)
);
/

CREATE TYPE gbm_test_type_tab IS TABLE OF gbm_test_type;
/

절차 사양은 다음과 같습니다.

CREATE PACKAGE GBM_TEST_TYPE_PKG as
procedure GBM_TEST_TYPE_SP(v_Str in varchar2,
op_type_tab out gbm_test_type_tab);
end GBM_TEST_TYPE_PKG;
/


CREATE PACKAGE BODY GBM_TEST_TYPE_PKG as
PROCEDURE GBM_TEST_TYPE_SP(v_Str in varchar2,
op_type_tab out gbm_test_type_tab)
IS

op_tab gbm_test_type_tab := gbm_test_type_tab();
op_icon_rec gbm_test_type;

err_msg VARCHAR2(10000):= '';

BEGIN
DBMS_OUTPUT.PUT_LINE('INSIDE PROC '||v_Str);
    BEGIN
        -- initializing to hard coded values        
        op_icon_rec := gbm_test_type(1,'temp');
        op_tab.extend;
        op_tab(1) := op_icon_rec;
    EXCEPTION
        WHEN OTHERS THEN
          err_msg := 'FAILURE WHILE INITIALIZING TEMP O/P RECORD--'|| SUBSTR(SQLERRM, 1 , 100);
    END;

-- finally set the ouput
op_type_tab := op_tab;

-- global exception handling
EXCEPTION 
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('failure message '|| SUBSTR(SQLERRM, 1 , 100));

END GBM_TEST_TYPE_SP;

END GBM_TEST_TYPE_PKG;
/  

Java 코드 스 니펫은 다음과 같습니다.

String spCallString = "{call GBM_TEST_SPS_PKG.GBM_TEST_SPS(?,?)}";
        spCallString = "{call GBM_TEST_TYPE_PKG.GBM_TEST_TYPE_SP(?,?)}";
        CallableStatement callStmt = null;
        try {
            callStmt = conn.prepareCall(spCallString);  
                        // set data to callable statement
                        callStmt.execute();

                        Object opObj = callStmt.getObject(2);// output is at index 2
                        if (opObj instanceof Array) {
            Array opArr = (Array) opObj;

                        Object val = opArr.getArray(); // this is the line throwing error

                        // further processing
                  } catch (SQLException e) {
                  // handle exception
                  } finally{
                   // handle resource release
                  }

문제에 대한 더 많은 컨텍스트 제공 :
다른 유형의 개체 집합과 다른 데이터를 가져 오는 패키지 (저장 프로 시저 포함)가 있습니다. 따르는 스타일은 동일합니다.
유형-> 저장 프로 시저에서 사용-> Java 코드
에서 실행 데이터베이스 사용자 A 또는 사용자 B를 사용하면이 저장 프로 시저에서 Java 코드로 데이터를 실행하고 가져올 수 있습니다.

감사합니다.
srguruprasad

구루 프라 사드

이 문제에 대한 해결책을 찾았습니다.
이 문제의 원인은 내가 가진 유형 정의 때문이었습니다.
확장 된 유형 정의를 사용하는 또 다른 저장 프로 시저가 있으며이 저장 프로시 저는 잘 작동합니다 (사용자 B로 연결될 때도).
유형 B (최종) 확장 유형 A (최종 아님)가 사용되는 구조입니다.
이 문제가있는 저장 프로 시저에서 사용되는 Type 구조는
Type C (최종 아님)입니다.
Type 구조를 Type D (final)가 Type C (최종 아님) 확장으로 변경하면
저장 프로 시저가 제대로 실행
되고 사용자 B로 연결될 때 데이터가 반환됩니다 .
Type E (final)로 테스트했지만 저장 프로 시저에서 데이터를 검색 할 수 없었습니다.
이 솔루션을 확인하기 위해 테스트 유형도 만들었습니다.
이것은 Oracle JDBC 구현 jar의 문제인 것 같습니다.

내 일반적인 기대는 최종 유형이 내부적으로 적절하게 사용되고 데이터가 반환되어야한다는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관