Динамическое выполнение процедуры

Привет, мне нужно выполнить удаленный вызов ...

DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@DB_LINK() 

... из хранимой процедуры.

Поскольку значение DB_LINK должно быть получено во время выполнения. Он должен выполняться динамически. я пытался использовать

 EXECUTE IMMEDIATE ' DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK||'()';

Но я получаю следующую ошибку

ORA-00900: invalid SQL statement

Может ли кто-нибудь посоветовать мне, как динамически выполнять хранимую процедуру?


person Saroj    schedule 23.07.2015    source источник
comment
Можете попробовать: ВЫПОЛНИТЬ НЕМЕДЛЕННО 'DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK   -  person Giova    schedule 23.07.2015
comment
хорошо, я не уверен, что это сработает, но попробуйте сделать это так: '||DB_LINK()   -  person Moudiz    schedule 23.07.2015
comment
До сих пор не работает. Я получаю ту же ошибку.   -  person Saroj    schedule 23.07.2015
comment
используя '||DB_LINK(). Он принимает DB_LINK() как функцию. И выдает, что функция DB_LINK() не найдена.   -  person Saroj    schedule 23.07.2015
comment
Ваш синтаксис кажется правильным: stackoverflow.com/q/240788/272735 Вы уверены, что значение DB_LINK правильное и ссылка на базу данных имеет права на выполнение пакета DBMS_STATS?   -  person user272735    schedule 23.07.2015


Ответы (2)


Подсказка заключается в точной формулировке сообщения об ошибке: invalid SQL statement. Как сказано в руководстве по PL/SQL, EXECUTE IMMEDIATE предназначен для выполнения динамические операторы SQL.

Вы выполняете вызов процедуры, т.е. PL/SQL, а не SQL. Итак, вам нужно передать анонимный блок в EXECUTE IMMEDIATE:

EXECUTE IMMEDIATE 
    'begin  DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK||'() ;  end;' 
    ;

DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO не принимает параметров, поэтому пустые скобки необязательны. Обязательно включите их, если они сделают вас счастливее.

person APC    schedule 24.07.2015

EXECUTE IMMEDIATE 'DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK();

должно работать, если DB_LINK является глобальной функцией, возвращающей строку VARCHAR2.

person doberkofler    schedule 23.07.2015
comment
DB_LINK выглядит как переменная. () относятся к вызову FLUSH_DATABASE_MONITORING_INFO. - person APC; 24.07.2015