데이터베이스 링크를 통해 SQL로 액세스 할 수있는 원격 Oracle 데이터베이스에 동의어가 있습니다 (예 :
).insert into my_table select * from [email protected]_database_link;
위의 문장을 PLSQL 블록에 넣으면 컴파일되지 않고 "ORA-00980 : 동의어 번역이 더 이상 유효하지 않습니다"라는 오류 메시지가 나타납니다. 표준 설명은 동의어가 가리키는 테이블 등입니다. 그러나 명령문이 SQL에서 작동하기 때문에 그렇지 않습니다.
- 답변 # 1
- 답변 # 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;
- ORA-03001: 구현되지 않은 기능을 제공하는 plsql to_date 함수
- oracle : 저장 프로시저 예외: ORA-06502: PL/SQL: 숫자 또는 값 오류: 문자열 버퍼가 너무 작습니다.
- sql : 쿼리 성능 향상
- oracle : plsql -날짜를 입력 할 수있는 기능을 만드는 방법 yyyy-mm -DD 및 기간 내부의 쓰기 날짜가 유효한 지 여부를 평가하는 기능
- 복잡한 SQL 쿼리를 간단한 쿼리로 단순화합니다
- oracle : 여러 수신자에게 메시지를 보내는 방법
- oracle : 오라클의 이전 레code와 함께 열 값을 비교하십시오
- sql : Oracle [01722 : 잘못된 숫자] regexp_substr을 숫자로 주조 할 때
- oracle : 로그 테이블 오라클의 CLOB로 다른 테이블 업데이트 로깅
- javascript : Oracle Apex Ajax 요청에서 쿠키를 가져옵니다
PL/SQL이 아닌 SQL에서는 무언가가 작동한다면 대부분의 경우 이것은 권한 문제입니다.
PL/SQL 블록을 입력 할 때 사용자가역할을 통해받은 모든 권한이 활성화되지 않습니다. 아마도 대부분의
SELECT
기본 테이블에 대한 권한은 역할을 통해 부여되므로 PL/SQL 블록에서 "활성"이 아닙니다.이것의 일반적인 치료법은 역할이 아닌 사용자에게 직접 권한을 부여하는 것입니다.