sourcecode

예외가 발생함 ORA-00942: 테이블 또는 뷰가 존재하지 않음 - 기존 테이블에 삽입할 때

codebag 2023. 9. 5. 20:15
반응형

예외가 발생함 ORA-00942: 테이블 또는 뷰가 존재하지 않음 - 기존 테이블에 삽입할 때

기존 테이블에 행 배치를 삽입할 때 아래 예외가 발생합니다.

ORA-00942: 테이블 또는 뷰가 존재하지 않습니다.

테이블이 db에 있는지 확인하고 오라클 sql developer를 사용하여 테이블에 데이터를 삽입할 수 있습니다.하지만 자바에서 준비된 문장을 사용하여 행을 삽입하려고 하면, 그것의 던지기 테이블에 오류가 없습니다.

아래에서 오류의 스택 추적을 찾으십시오.

java.sql.SQLException: ORA-00942: table or view does not exist

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) 
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573) 
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1889)
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout>>(OracleStatement.java:2709)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
    at quotecopy.DbConnection.insertIntoDestinationDb(DbConnection.java:591)
    at quotecopy.QuoteCopier.main(QuoteCopier.java:72) 

누가 이 오류의 원인을 제시할 수 있습니까?

업데이트 : 문제 해결됨

데이터베이스 연결 속성이나 테이블 또는 보기 이름에 문제가 없습니다.그 문제에 대한 해결책은 매우 이상했습니다.제가 삽입하려고 했던 열 중 하나는 Clob 타입이었습니다.이전에 오라클 db에서 clob 데이터를 처리하는 데 많은 어려움을 겪었기 때문에 clob setter를 임시 문자열 setter로 교체하고 동일한 코드를 문제없이 실행하여 모든 행이 올바르게 삽입되었습니다!!!!

i. peared statement.setClob(열)인덱스, 클로브)

로 대체되었습니다.

격조 있는 진술setString(열)색인, "문자열")

오류 테이블 또는 보기가 존재하는 이유는 clob 데이터를 삽입할 때 오류를 발생시킵니다.설명해주실 분 있나요?

당신의 답변과 의견에 감사합니다.

테이블이 존재하지만 사용자에게 권한이 없는 경우에도 Oracle은 이 오류를 보고합니다.따라서 테이블이 그곳에 있는지 확신할 경우 허가를 확인합니다.

setCLOB()에 문제가 있어 대상 테이블이 존재하고 권한이 올바르게 부여된 경우 일부 상황에서 ORA-00942가 발생합니다.저는 지금 바로 이 문제를 겪고 있습니다. CLOB를 같은 테이블에 묶지 않음으로써 ORA-00942를 제거할 수 있습니다.

java.sql로 setClob()을 해봤습니다.clob하고 oracle.jdbc를 사용하여 CLOB()를 설정합니다.CLOB이지만 결과는 같습니다.

말씀하신 대로 문자열로 바인딩하면 문제가 사라지지만 데이터 크기가 4k로 제한됩니다.

테스트 결과, CLOB를 바인딩하기 전에 세션에서 트랜잭션이 열려 있을 때 트리거된 것으로 보입니다.이 문제가 해결되면 피드백을...Oracle 지원을 확인합니다.

데이터베이스 연결 속성이나 테이블 또는 보기 이름에 문제가 없습니다.그 문제에 대한 해결책은 매우 이상했습니다.제가 삽입하려고 했던 열 중 하나는 Clob 타입이었습니다.이전에 오라클 db에서 clob 데이터를 처리하는 데 많은 어려움을 겪었기 때문에 clob setter를 임시 문자열 setter로 교체하고 동일한 코드를 문제없이 실행하여 모든 행이 올바르게 삽입되었습니다!!!!

i. peared statement.setClob(열)인덱스, 클로브)

로 대체되었습니다.

격조 있는 진술setString(열)색인, "문자열")

@언벨리의 말이 맞습니다.테이블에 적절한 보조금이 없으면 이 오류가 발생합니다.저는 최근에 이런 일을 겪었습니다.저는 당신이 설명한 바로 그 문제를 경험하고 있었습니다. 저는 sql developer를 통해 insert 문을 실행할 수 있었지만 hibernate를 사용할 때 실패했습니다.저는 마침내 제 코드가 명백한 삽입 이상의 일을 하고 있다는 것을 깨달았습니다.적절한 부여가 없는 다른 테이블에 삽입합니다.보조금 권한을 조정하여 이 문제를 해결했습니다.

참고: 의견을 제시할 평판이 없습니다. 그렇지 않으면 의견이었을 수 있습니다.

데이터를 4K로 제한하는 JDBC의 setString() 메서드를 사용하지 않고 이 문제를 해결하는 방법을 찾았습니다.

preparedStatement.setClob(int 매개 변수)을 사용해야 합니다.색인, 독서자).적어도 이것이 제게 효과가 있었던 것입니다.오라클 드라이버가 데이터를 문자 스트림으로 변환하여 삽입한다고 생각했지만, 그렇지 않은 것 같습니다.또는 오류를 유발하는 특정한 것.

캐릭터를 사용하는 것은 스트림이 저에게 효과가 있는 것 같습니다.저는 한 DB에서 테이블을 읽고 jdbc를 사용하여 다른 DB에 쓰고 있습니다.그리고 위에 언급된 것처럼 테이블을 찾을 수 없는 오류가 발생했습니다.그래서 저는 이렇게 문제를 해결한 방법입니다.

case Types.CLOB:   //Using a switch statement for all columns, this is for CLOB columns
        Clob clobData = resultSet.getClob(columnIndex); // The source db
        if (clobData != null) {
            preparedStatement.setClob(columnIndex, clobData.getCharacterStream());
        } else {
            preparedStatement.setClob(columnIndex, clobData);
        }
        clobData = null;
        return;

이제 괜찮아요.

우리는 BLOB 칼럼에서 이 문제를 경험했습니다.이 오류가 발생할 때 다른 사용자가 이 문제에 도달할 경우를 대비하여 다음과 같이 문제를 해결했습니다.

우리는 다음과 같이 시작했습니다.

            preparedStatement.setBlob(parameterIndex, resultSet.getBlob(columnName)); break;

이 행을 다음과 같이 변경하여 문제를 해결했습니다.

        java.sql.Blob blob = resultSet.getBlob(columnName);
        if (blob != null) {
            java.io.InputStream blobData =  blob.getBinaryStream();
            preparedStatement.setBinaryStream(parameterIndex, blobData);
        } else {
            preparedStatement.setBinaryStream(parameterIndex, null);
        }

스크립트가 스키마 이름을 제공합니까? 아니면 데이터베이스에 로그인한 사용자가 기본 스키마를 선택합니까?

스키마의 이름을 지정하지 않고 스키마 사용자 대신 시스템 사용자와 배치를 수행하면 대상 스키마가 기본 스키마로 설정된 사용자가 실행할 경우 정상적으로 작동하는 스크립트의 실행 컨텍스트가 잘못될 수 있습니다.스키마 이름을 삽입 문에 포함하는 것이 가장 좋습니다.

INSERT INTO myschema.mytable (mycolums) VALUES ('myvalue')

update: 준비된 문에서 테이블 이름을 바인딩 값으로 바인딩하시겠습니까?그건 안 돼요.

제게 도움이 됩니다.

Clob clob1;
while (rs.next()) {
   rs.setString(1, rs.getString("FIELD_1"));

   clob1 = rs.getClob("CLOB1");
   if (clob1 != null) {
      sta.setClob(2, clob1.getCharacterStream());
   } else {
      sta.setClob(2, clob1);
   }
   clob1 = null;

   sta.setString(3, rs.getString("FIELD_3"));
}

당신이 하고 있는 것이 가능합니까?INSERT위해서VARCHAR하지만 하는 것은INSERT그 다음에UPDATE위해서CLOB?

만약 그렇다면, 당신은 허가해야 할 것입니다.UPDATE테이블에 대한 추가 권한INSERT.

https://stackoverflow.com/a/64352414/1089967 을 참조하십시오.

여기 질문에 대한 해결책이 있습니다.만약 당신이 그것을 사용하고 있다면 문제는 유리 물고기에 있습니다.JNDI 이름을 생성할 때 풀 이름이 올바른지, 풀 이름이 생성된 연결 풀 이름인지 확인합니다.

enter image description here

언급URL : https://stackoverflow.com/questions/6561650/getting-an-exception-ora-00942-table-or-view-does-not-exist-when-inserting-in

반응형