>

데이터베이스 링크를 통해 SQL로 액세스 할 수있는 원격 Oracle 데이터베이스에 동의어가 있습니다 (예 :

).

insert into my_table select * from [email protected]_database_link;

위의 문장을 PLSQL 블록에 넣으면 컴파일되지 않고 "ORA-00980 : 동의어 번역이 더 이상 유효하지 않습니다"라는 오류 메시지가 나타납니다. 표준 설명은 동의어가 가리키는 테이블 등입니다. 그러나 명령문이 SQL에서 작동하기 때문에 그렇지 않습니다.

  • 답변 # 1

    PL/SQL이 아닌 SQL에서는 무언가가 작동한다면 대부분의 경우 이것은 권한 문제입니다.

    PL/SQL 블록을 입력 할 때 사용자가역할을 통해받은 모든 권한이 활성화되지 않습니다. 아마도 대부분의 SELECT  기본 테이블에 대한 권한은 역할을 통해 부여되므로 PL/SQL 블록에서 "활성"이 아닙니다.

    이것의 일반적인 치료법은 역할이 아닌 사용자에게 직접 권한을 부여하는 것입니다.

  • 답변 # 2

    도움을 시도한 모든 사람에게 감사합니다. 이것은 Oracle 제한 사항으로 판명되었습니다.

    https://support.oracle.com/rs?type=doc&id=453754.1

    와이즈 비즈

  • 답변 # 3

    연결 문자열에서 사용하는 사용자에 대해 "my_synonym"에 대한 원격 데이터베이스 권한 부여는 거의 "select"여야합니다.이 동의어가 가리키는 오브젝트도 확인하십시오 (누군가 테이블을 삭제했을 수도 있음).

  • 답변 # 4

    테이블/뷰/프로 시저의 소유자가 SYNONYM에 언급 된 소유자와 일치하지 않을 때이 문제를 발견했습니다.

    예 : TABLE_BRACH 테이블의 소유자가 ownerA이고 동의어에서 언급 된 테이블 소유자가 다른 것 (ownerA 아님) 인 경우

    솔루션 :   1. SYNONYM을 삭제   2. 올바른 소유자로 동일한 이름으로 생성하십시오.

    APPLIES TO:

    PL/SQL - Version 9.2.0.8 and later Information in this document applies to any platform. Checked for relevance on 01-Apr-2015

    SYMPTOMS

    A PL/SQL block fails with error: ORA-00980: synonym translation is no longer valid, when selecting data from a remote database. The following code demonstrates this issue:

    On DB3 (create the table)

    CONNECT u3/u3 DROP TABLE tab; CREATE TABLE tab(c1 number); INSERT INTO tab VALUES (1); COMMIT;

    On DB2 (create a synonym to the table on DB3)

    CONNECT u2/u2 DROP DATABASE LINK dblink2; CREATE DATABASE LINK dblink2 CONNECT TO u3 IDENTIFIED BY u3 USING 'EMT102U6'; SELECT * FROM [email protected]; DROP SYNONYM syn2; CREATE SYNONYM syn2 FOR [email protected]; SELECT * FROM syn2;

    On DB1 (create a synonym to the synonym on DB2)

    CONNECT u1/u1 DROP DATABASE LINK dblink1; CREATE DATABASE LINK dblink1 CONNECT TO u2 IDENTIFIED BY u2 USING 'EMT102W6'; SELECT * FROM [email protected]; DROP SYNONYM syn1; CREATE SYNONYM syn1 FOR [email protected]; SELECT c1 from syn1;

    This works in SQL but fails when called from PL/SQL

    DECLARE num NUMBER; BEGIN SELECT c1 INTO num FROM syn1; END; /

    ERROR at line 4: ORA-06550: line 4, column 3: PL/SQL: ORA-00980: synonym translation is no longer valid ORA-06550: line 4, column 3: PL/SQL: SQL Statement ignored

    CAUSE

    This issue was reported in Bug 2829591 QUERING FROM A PL/SQL PROCEDURE IN 9I ->8I->7.3.4, GETTING ORA-980. This bug was closed as 'NOT A BUG' for the following reasons

    PL/SQL cannot instruct middle database (DB2) to follow the database link during the compilation phase. Therefore in order for this PL/SQL block to compile and run, both database links dblink1 and dblink2 should be defined on the front end database - DB1. During runtime database link dblink2 will be looked up in DB2 as expected.

    SOLUTION

    To implement the solution, please execute the following steps:

      Create a database link dblink2 on DB1 pointing to DB3

    SQL>create database link dblink2 connect to u3 identified by u3 using 'EMT102U6';

      Create and compile the PL/SQL block on DB1.

    CREATE DATABASE LINK dblink2 CONNECT TO u3 IDENTIFIED BY u3 USING 'EMT102U6';

    SELECT * FROM [email protected]; DECLARE num NUMBER; BEGIN
    SELECT c1 INTO num FROM syn1; END; / PL/SQL procedure successfully completed.

    TIP: Another option is to use dyanmic SQL in the PL/SQL block as a work around. When using dynamic SQL the database link is not resolved at compile time but at runtime.

  • 답변 # 5

    해결 방법은 Oracle보기를 대신 사용하는 것입니다.

    CREATE PUBLIC SYNONYM BRANCH FOR ownerA.TABLE_BRACH ;
    
    

    그러면 패키지 또는 프로 시저의보기를 참조하십시오 (예 :

    CREATE VIEW v_my_synomym as (select * from [email protected]_database_link);
    
    

    insert into my_table select * from v_my_synonym;

  • 이전 postman - mpgs (마스터 카드) - 거래를 토큰 화하는 방법 (토큰 생성 방법)?
  • 다음 python - Wxpython, 주어진 키 코드로 wxKeyEvent를 만드는 방법은 무엇입니까?