Хранимая процедура Oracle вызвала ок из локальной, но ошибка из dblink - PullRequest
1 голос
/ 26 сентября 2019

У меня есть хранимая процедура Oracle, которая скомпилирована без ошибок и работает с ожидаемым результатом.Вот как я называю это в локальной БД:

variable v_emp_cur refcursor;
  exec my_schema.SP_READ_MEMBER('12345678', '', :v_emp_cur);
print v_emp_cur;

Результат напечатан хорошо.Однако, когда я вызываю этот SP из другой БД, используя dblink, как показано ниже:

variable v_emp_cur refcursor;
  exec my_schema.SP_READ_MEMBER@my_dblink('12345678', '', :v_emp_cur);
print v_emp_cur;

Возвращает это сообщение об ошибке:

BEGIN my_schema.sp_read_member@my_dblink('12345678', '', :v_emp_cur); END;
Error at line 2
ORA-00604: error occurred at recursive SQL level 1
ORA-00900: invalid SQL statement

Поскольку моя хранимая процедура была скомпилирована с /o ошибка, и возвращает данные из локального вызова, я ожидаю, что в этом нет ошибки.Но я не уверен на 100%, вот моя хранимая процедура:

CREATE OR REPLACE procedure my_schema.SP_READ_MEMBER(keywordP in varchar2, birthdayP in varchar2, resultP out sys_refcursor)
is
v_prg_name varchar2(20) := 'SP_READ_MEMBER';
sys_sql    varchar2(1000);


begin
  Insertlog(SYSDATE, v_prg_name, '1.0 Start');
  sys_sql :=  sys_sql || 'select a.no, a.name, a.id_no, to_char(a.birthday, ''yyyy/MM/dd'') as birthday, ''REAL member'' as mtype, email, mobile from rep  a where 1=1 ';
  if keywordP is not null then
    sys_sql :=  sys_sql || ' and (a.no=''' || keywordP || ''' or a.name=''' || keywordP || ''' or a.id_no=''' || keywordP || ''') ';
  end if;
  if birthdayP is not null then
    sys_sql :=  sys_sql || ' and a.birthday=to_date(''' || birthdayP || ''', ''yyyy/MM/dd'') ';
  end if;

  open resultP for sys_sql;
  Insertlog(SYSDATE, v_prg_name, '2.0 Finished w/o error');

  exception
  when others then
  declare
    error_time VARCHAR2(30) := RTRIM(TO_CHAR(SYSDATE, 'YYYY/MM/DD, HH24:MI:SS'));
    error_code NUMBER := SQLCODE;
    error_msg  VARCHAR2(300) := SQLERRM;
  begin
    rollback;
    DBMS_OUTPUT.PUT_LINE(error_time || ',' || TO_CHAR(error_code) || ',' || error_msg);
    Insertlog(SYSDATE, v_prg_name,  error_msg || ', 3.0 ERROR, sql:' || sys_sql);
  end;
end SP_READ_REP;
/

Как мне решить эту проблему?

Любые предложения приветствуются ~

1 Ответ

1 голос
/ 26 сентября 2019

Вы попали в ограничение. Объявление переменной курсора говорит:

Использование переменной курсора в удаленном вызове процедуры (RPC) между серверами приводит к ошибке.Однако вы можете использовать переменную курсора в межсерверном RPC, если удаленная база данных является базой данных, отличной от Oracle, доступ к которой осуществляется через процедурный шлюз.

Обходное решение может заключаться в перемещении процедуры в вашулокальная база данных и выборка данных по ссылке базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...