DECLARE
name VARCHAR2(20);
BEGIN
INSERT INTO emp@tlink VALUES (1, 'Susan');
SELECT name INTO name FROM emp@tlink WHERE rownum = 1;
UPDATE emp@tlink SET name = 'Peter' WHERE id = 1;
DELETE FROM emp@tlink WHERE id = 1;
END;
/
다음은 원격 테이블 컬럼 %TYPE과 %ROWTYPE 참조의 예입니다.
서브 프로그램 호출
원격 데이터베이스에 저장된 (패키지) 함수와 (패키지) 프로시저를 호출할 수 있습니다. 로컬 데이터베이스 서 브 프로그램에 접근하는 것과 동일하게 사용할 수 있습니다. 서브 프로그램을 호출하는 방법은 다음과 같습니다.
다음은 원격 서브 프로그램 호출의 예입니다.
복합 타입 참조
원격 데이터베이스의 패키지에 선언된 복합 타입 을 참조할 수 있습니다. 이러한 복합 타입은 로컬 tbPSM 프 로그램의 선언부, 서브 프로그램의 파라미터, 함수의 반환 타입으로 사용할 수 있습니다.
복합 타입을 선언부, 서브 프로그램의 파라미터나 함수의 반환 타입으로 사용하는 경우 컴파일 시점에 원 격 복합 타입의 구조 정보가 로컬에 저장되며, 이후 실행 시점에는 저장된 구조 정보를 기준으로 처리된 다. 이 경우 원격지의 복합 타입이 변경되더라도, 로컬 프로그램은 기존 정보에 따라 동작하므로 타입 불 일치가 발생할 수 있습니다.
반면, 복합 타입을 인자로 하여 원격 서브 프로그램을 호출할 때는 실행 시점마다 원격지의 복합 타입 정 의를 참조하여 타입 일치 여부를 확인합니다. 따라서 원격지 타입이 변경되어 타입 불일치 시 오류가 발생할 수 있습니다. 이는 복합 타입이 런타임에 동적으로 참조됨을 의미합니다.
주의
데이터베이스 링크의 대상이 Tibero가 아닌 다른 DBMS라면 복합 타입을 원격 서브 프로그램의 파 라미터나 반환 타입으로 사용할 수 없습니다.
DECLARE
music_info musics@tlink%ROWTYPE;
music_title musics.title@tlink%TYPE;
-- music_title (musics@tlink).title%TYPE; 와 동일함
BEGIN
SELECT * INTO music_info FROM musics@tlink WHERE kind = 'POP';
music_title := music_info.title;
DBMS_OUTPUT.PUT_LINE(music_title);
END;
/
["스키마 이름".]["패키지 이름".]"서브 프로그램 이름"@"링크 이름" (인자들)
DECLARE
result NUMBER;
v_total NUMBER;
BEGIN
update_salary@tlink(1001, 5000);
result := get_salary@tlink(1001);
DBMS_OUTPUT.PUT_LINE('1001 사번 급여: ' || result);
v_total := hr_pkg.get_total_salary@tlink();
DBMS_OUTPUT.PUT_LINE('전 직원 급여: ' || v_total);
END;
/
-- (원격 데이터베이스)
CREATE OR REPLACE PACKAGE remote_pkg
IS
TYPE sample_rec IS RECORD (
name VARCHAR2(20),
age NUMBER(5)
);
END remote_pkg;
/
-- (로컬 데이터베이스)
CREATE OR REPLACE FUNCTION get_sample_record RETURN remote_pkg.sample_rec@tlink
IS
res remote_pkg.sample_rec@tlink;
BEGIN
res.name := 'Jin';
res.age := 30;
RETURN res;
END;
/
CREATE OR REPLACE PROCEDURE print_sample_record(p_rec remote_pkg.sample_rec@tlink)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Name : ' || p_rec.name || ' Age : ' || p_rec.age);
END;
/
EXEC print_sample_record(get_sample_record);
Name : Jin Age : 30
-- (원격 데이터베이스)
CREATE OR REPLACE PACKAGE remote_pkg
IS
TYPE sample_rec IS RECORD (
name VARCHAR2(20),
age NUMBER(5)
);
PROCEDURE process_sample_rec(p_rec IN OUT sample_rec);
FUNCTION make_sample_rec(p_name VARCHAR2, p_age NUMBER) RETURN sample_rec;
END remote_pkg;
/
CREATE OR REPLACE PACKAGE BODY remote_pkg
IS
PROCEDURE process_sample_rec(p_rec IN OUT sample_rec)
IS
BEGIN
p_rec.name := p_rec.name || '_Mod';
p_rec.age := p_rec.age + 1;
END process_sample_rec;
FUNCTION make_sample_rec(p_name VARCHAR2, p_age NUMBER) RETURN sample_rec
IS
v_rec sample_rec;
BEGIN
v_rec.name := p_name;
v_rec.age := p_age;
RETURN v_rec;
END make_sample_rec;
END remote_pkg;
/
-- (로컬 데이터베이스)
CREATE OR REPLACE PROCEDURE local_proc
IS
v_rec remote_pkg.sample_rec@tlink;
BEGIN
v_rec := remote_pkg.make_sample_rec@tlink('Jin', 20);
remote_pkg.process_sample_rec@tlink(v_rec);
DBMS_OUTPUT.PUT_LINE('Name : ' || v_rec.name || ' Age : ' || v_rec.age);
END;
/
EXEC local_proc;
Name : Jin_Mod Age : 21