【问题标题】:Oracle stored procedure called ok from local, but error from dblinkOracle 存储过程从本地调用 ok,但从 dblink 出错
【发布时间】:2019-09-26 08:36:52
【问题描述】:

我有一个 Oracle 存储过程,它编译时没有出现错误,并且运行结果符合我的预期。这是我在本地数据库中的称呼:

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

打印效果很好。但是,当我使用 dblink 从另一个数据库调用此 SP 时,如下所示:

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

由于我的存储过程编译时没有错误,并从本地调用返回数据,我预计其中没有错误。但我不是 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 members  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;
/

我该如何解决这个问题?

欢迎提出建议~

【问题讨论】:

    标签: oracle stored-procedures dblink


    【解决方案1】:

    你遇到了限制。 Cursor variable declaration 说:

    在服务器到服务器远程过程调用 (RPC) 中使用游标变量会导致错误。但是,如果远程数据库是通过过程网关访问的非 Oracle 数据库,您可以在服务器到服务器 RPC 中使用游标变量。

    解决方法可能是将过程移至本地数据库并通过数据库链接获取数据。

    【讨论】:

    • 由于某些办公室安全政策,我无法通过 DBLink 从远程数据库获取数据,这就是为什么我必须将存储过程放入远程数据库的原因。有什么办法可以解决这个问题吗?
    • 如果有,我不知道,抱歉。
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 2012-05-18
    • 2011-04-25
    • 2015-05-22
    • 2012-01-27
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多