programing

Oracle: 저장 프로시저에서 데이터베이스 링크 사용: 테이블 또는 보기가 존재하지 않습니다.

minecode 2023. 9. 2. 09:45
반응형

Oracle: 저장 프로시저에서 데이터베이스 링크 사용: 테이블 또는 보기가 존재하지 않습니다.

현재 저장 프로시저 내에서 연결된 데이터베이스의 테이블을 참조할 수 없는 문제가 있습니다.다음 오류 메시지가 표시됩니다.

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

다음은 원격 데이터베이스에 대한 데이터베이스 링크를 설정하기 위해 호스트 시스템(오라클 10g 실행)에서 수행한 단계입니다(오라클 11g 실행).단계는 정확하지만 일부 이름이 변경되었지만 일관성 있게 유지되었습니다.

  1. tnsnames.ora를 업데이트하고 새 항목을 추가합니다.

    REMOTE_DB =
        (DESCRIPTION =
            (ADDRESS = (PROTOCOL = TCP)
                       (HOST = 10.10.10.10)
                       (QUEUESIZE = 20)
                       (PORT = 1521)
            )
            (CONNECT_DATA =
                       (SERVICE_NAME = remote_service)
            )
        )
    
  2. 나중에 저장 프로시저를 만들고 실행할 사용자로 데이터베이스 링크를 만듭니다.

    create database link remote_link
    connect to "remote_user"
    identified by "remote_pass"
    using 'REMOTE_DB';
    
  3. 데이터베이스 링크에서 다음 항목을 선택하여 데이터베이스 링크가 작동하는지 확인합니다.

    select id from remote_table@remote_link;
    
    id
    --------------------------------------------------------------------------------
    8ac6eb9b-fcc1-4574-8604-c9fd4412b917
    c9e7ee51-2314-4002-a684-7817b181267b
    cc395a81-56dd-4d68-9bba-fa926dad4fc7
    d6b450e0-3f36-411a-ba14-2acc18b9c008
    
  4. 작업 데이터베이스 링크에 따라 저장 프로시저를 만듭니다.

    create or replace
    PROCEDURE test_remote_db_link
    AS
    v_id varchar(50);
    BEGIN   
        select id into v_id from remote_table@remote_link where id = 'c9e7ee51-2314-4002-a684-7817b181267b';
        dbms_output.put_line('v_id : ' || v_id);
    END test_remote_db_link;
    
  5. 근무일 전체에 걸쳐 다음 오류 메시지를 확인한 후 자신의 머리를 폭발시킵니다.

    Error(10,27): PL/SQL: ORA-00942: table or view does not exist
    

저는 이 문제를 해결하기 위해 다음과 같은 많은 노력을 기울였습니다.

  1. 데이터베이스 링크를 만들 때 사용자 이름과 암호 주위에 따옴표를 사용하지 않습니다.링크를 선택하면 다음 오류가 발생합니다.

    ERROR at line 1:
    ORA-01017: invalid username/password; logon denied
    ORA-02063: preceding line from TWS_LINK
    
  2. 사용자 이름과 암호의 다양한 조합을 대문자와 소문자로 사용해 보았습니다.1과 동일한 오류를 수신했습니다.

  3. 사용자 이름과 암호 주위에 큰따옴표 대신 작은따옴표를 사용해 보았습니다.다음 오류가 발생했습니다.

    ERROR at line 1:
    ORA-00987: missing or invalid username(s)
    
  4. sqlplus를 사용하여 원격 DB에 연결하여 원격 DB에 대한 전체 액세스 권한을 가지고 있음을 증명했습니다.

    [oracle]$ sqlplus remote_user/remote_pass@REMOTE_DB
    
    SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 20 22:23:12 2011
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> 
    

다음에 뭘 해야 할지 모르겠어요.가능한 다음 단계는 원격 데이터베이스의 문제를 확인하고 다른 데이터베이스가 연결할 수 있는지 확인하는 것입니다.또 다른 방법은 호스트 10g에서 원격 11g으로 이어지는 비호환성입니다.

좋습니다. 그래서 저는 이것을 작동시킬 수 있었습니다.

데이터베이스 링크를 만들 때 사용자 이름 및 암호 필드 주변의 큰따옴표가 문제의 원인인 것으로 나타났습니다.요약:

해당 링크가 존재하고 링크가 생성된 경우:

create database link remote_link
connect to "remote_user"
identified by "remote_pass"
using 'REMOTE_DB';
  1. SQL을 통해 원격 데이터베이스를 쿼리할 수 있습니다.
  2. 저장 프로시저를 컴파일할 수 없습니다. ORA-942 오류가 발생했습니다.
  3. 프로시저를 컴파일할 수 없어 실행할 수 없습니다.

큰따옴표가 없는 경우:

create database link remote_link
connect to remote_user
identified by remote_pass
using 'REMOTE_DB';
  1. SQL을 통해 원격 데이터베이스를 쿼리할 수 없습니다. 잘못된 암호 오류가 수신되었습니다(질문에 자세히 설명됨).
  2. 저장 프로시저를 오류 없이 컴파일할 수 있습니다.
  3. 저장 프로시저는 예상대로 실행되어 데이터베이스 링크 전체에서 데이터를 검색하여 표시합니다.

따라서 SQL을 통해 원격 데이터베이스를 쿼리할 수 없더라도 잘못된 암호 오류가 발생하면 이와 동일한 연결 정보를 사용하는 절차가 컴파일되어 정상적으로 실행됩니다.

저는 여러분이 동의할 것이라고 확신합니다. 이것은 이상한 상황입니다. 그리고 저는 제 시나리오에서 그것을 작동시키는 것을 진정으로 우연히 발견했습니다.답이 없는 질문들이 많기 때문에 해결책이라고 부를 수 있을지 잘 모르겠습니다.

누군가 구글을 통해 이곳에 온다면, 그들은 이 대답이 유용하다는 것을 알게 될 것이고, 적어도 그들의 코드를 실행할 수 있기를 바랍니다.

GC.

저는 11gR2에서 같은 문제에 직면했고, 문제를 찾는 데 도움을 준 이 포럼에 감사드립니다.SQL 및 프로시저 모두에서 db 링크가 작동하도록 하는 방법은 아래 구문을 따르는 것입니다(중따옴표 안에 있는 암호만 포함).

create database link remote_link
connect to remote_user
identified by "remote_pass"
using 'REMOTE_DB';

여기 문제가 있는 것 같아요.저장 프로시저를 실행하는 사용자가 저장 프로시저를 생성한 사용자와 동일합니까?

"나중에 저장 프로시저를 실행할 사용자로 데이터베이스 링크를 작성합니다."라고 말했습니다.

데이터베이스 링크를 생성하는 사용자와 저장 프로시저를 생성하는 사용자가 다를 경우 문제가 발생할 수 있습니다.

동일한 사용자로 저장 프로시저 및 데이터베이스 링크를 만들거나 공용 데이터베이스 링크를 만듭니다.

그런 다음 Oracle 기본값이 정의자 권한이므로 저장 프로시저에 대한 실행 권한이 부여된 것으로 가정하여 모든 사용자가 저장 프로시저를 실행하도록 할 수 있습니다.

언급URL : https://stackoverflow.com/questions/7839530/oracle-using-a-database-link-in-a-stored-procedure-table-or-view-does-not-exi

반응형