2014-10-22 9 views
0

Я хотел бы создать ссылку на базу данных внутри скрипта и хочу получить все имена таблиц из связанной базы данных. Если я прав, мне нужно создать ссылку на базу данных для использования, но Oracle не позволяет мне создавать такую ​​вещь ни внутри my_fn, ни DECLARE. Любое предложение?PLSQL - создать внутреннюю функцию DBLink

DECLARE 

TYPE tp_col_array IS TABLE OF varchar2(1000); 
FUNCTION my_fn( 
    p_in_dblink_name IN VARCHAR2,  
    p_in_schema_name IN VARCHAR2) 
    RETURN varchar2 AS 
     vr_coll_table tp_col_array; 
     vr_coll_owner tp_col_array; 

    BEGIN    
     create database link "database1" 
     connect to my_name 
     identified by "my_password" 
     using 'database1';  

     SELECT owner, table_name 
     bulk collect into vr_coll_owner, vr_coll_table 
     FROM [email protected] 
     WHERE OWNER NOT IN ('SYS'); 

    RETURN TO_CHAR(vr_coll_owner(1));  //just for temporary 
END my_fn; 

BEGIN 

    DBMS_OUTPUT.PUT_LINE(my_fn('link1','schema1')); 

END; 

EDIT Я также попытался следующие, но не повезло :(

Execute immediate q'[create database link "database1" 
     connect to my_name 
     identified by "my_password" 
     using 'database1']'; 
+6

Определить «не повезло». Вы получаете сообщение об ошибке? Если да, то какая ошибка? Если вы создаете динамическую базу данных в блоке PL/SQL, каждая ссылка на эту ссылку базы данных также должна использовать динамический SQL, иначе ваш блок не будет компилироваться. Ваш оператор 'SELECT' должен использовать' EXECUTE IMMEDIATE'. Отступив назад, создание ссылок на базы данных во время выполнения, как правило, является плохой практикой - я бы серьезно задался вопросом, почему вы идете по этому пути. –

+0

@JustinCave Использование динамического SQL для оператора select отлично работает! Спасибо! Почему вы не опубликовали это как ответ, так что я могу отметить его как правильный ответ. – Adrian

ответ

0

Если вы создаете динамическую базу данных в блоке PL/SQL, каждая ссылка на эту ссылку базы данных также должна использовать динамический SQL, иначе ваш блок не будет компилироваться. Вы также должны использовать EXECUTE IMMEDIATE. Отступив назад, создание ссылок на базы данных во время выполнения, как правило, является плохой практикой - я бы серьезно задался вопросом, почему вы идете по этому пути.

Согласно комментарию Джастина Кейва

-1

Убедитесь в том, Определитель-схема предоставлена ​​"создать базу данных ссылка" привилегия.

Этот рабочий:

[email protected]> execute execute immediate 'create database link superlink connect to a identified by b using ''TNSALIAS'''; 

PL/SQL procedure successfully completed. 

[email protected]> @mylinks 

DB_LINK   USERNAME  PASSWORD  HOST      CREATED 
--------------- --------------- --------------- ------------------------- -------------------- 
SUPERLINK  A        TNSALIAS     22.10.2014 22:42:19 

 Смежные вопросы

  • Нет связанных вопросов^_^