Oracle: 저장 프로시저에서 데이터베이스 링크 사용: 테이블 또는 보기가 존재하지 않습니다.
현재 저장 프로시저 내에서 연결된 데이터베이스의 테이블을 참조할 수 없는 문제가 있습니다.다음 오류 메시지가 표시됩니다.
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다.
다음은 원격 데이터베이스에 대한 데이터베이스 링크를 설정하기 위해 호스트 시스템(오라클 10g 실행)에서 수행한 단계입니다(오라클 11g 실행).단계는 정확하지만 일부 이름이 변경되었지만 일관성 있게 유지되었습니다.
tnsnames.ora를 업데이트하고 새 항목을 추가합니다.
REMOTE_DB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 10.10.10.10) (QUEUESIZE = 20) (PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = remote_service) ) )
나중에 저장 프로시저를 만들고 실행할 사용자로 데이터베이스 링크를 만듭니다.
create database link remote_link connect to "remote_user" identified by "remote_pass" using 'REMOTE_DB';
데이터베이스 링크에서 다음 항목을 선택하여 데이터베이스 링크가 작동하는지 확인합니다.
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
작업 데이터베이스 링크에 따라 저장 프로시저를 만듭니다.
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;
근무일 전체에 걸쳐 다음 오류 메시지를 확인한 후 자신의 머리를 폭발시킵니다.
Error(10,27): PL/SQL: ORA-00942: table or view does not exist
저는 이 문제를 해결하기 위해 다음과 같은 많은 노력을 기울였습니다.
데이터베이스 링크를 만들 때 사용자 이름과 암호 주위에 따옴표를 사용하지 않습니다.링크를 선택하면 다음 오류가 발생합니다.
ERROR at line 1: ORA-01017: invalid username/password; logon denied ORA-02063: preceding line from TWS_LINK
사용자 이름과 암호의 다양한 조합을 대문자와 소문자로 사용해 보았습니다.1과 동일한 오류를 수신했습니다.
사용자 이름과 암호 주위에 큰따옴표 대신 작은따옴표를 사용해 보았습니다.다음 오류가 발생했습니다.
ERROR at line 1: ORA-00987: missing or invalid username(s)
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';
- SQL을 통해 원격 데이터베이스를 쿼리할 수 있습니다.
- 저장 프로시저를 컴파일할 수 없습니다. ORA-942 오류가 발생했습니다.
- 프로시저를 컴파일할 수 없어 실행할 수 없습니다.
큰따옴표가 없는 경우:
create database link remote_link
connect to remote_user
identified by remote_pass
using 'REMOTE_DB';
- SQL을 통해 원격 데이터베이스를 쿼리할 수 없습니다. 잘못된 암호 오류가 수신되었습니다(질문에 자세히 설명됨).
- 저장 프로시저를 오류 없이 컴파일할 수 있습니다.
- 저장 프로시저는 예상대로 실행되어 데이터베이스 링크 전체에서 데이터를 검색하여 표시합니다.
따라서 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
'programing' 카테고리의 다른 글
PowerShell 시작 텍스트를 제거하려면 어떻게 해야 합니까? (0) | 2023.09.02 |
---|---|
WHERE...IN을 사용하여 여러 행을 업데이트하는 중 (0) | 2023.09.02 |
PowerShell에서 배너 메시지를 제거하는 방법 (0) | 2023.09.02 |
매일 특정 시간에 MySQL 이벤트 스케줄러 (0) | 2023.09.02 |
봄: 프로필에서 AND를 수행하는 방법? (0) | 2023.09.02 |