下面是函数中使用游标的关键语句,赋于不同的脚本执行情况不一样,怎么会这样?难道跨数据库不支持?:  v_sql  varchar2(1000);  
  c1     integer;  v_sql:=‘select * from table’;--一切正常;  
  v_sql:=‘select * from Test.table’;--再表名前加别的库名作前缀,parse时报错;提示表不存在;  c1 := dbms_sql.open_cursor;
  dbms_sql.parse(c1, v_sql, dbms_sql.native);

解决方案 »

  1.   

    给你的当前用户授权访问test用于的table表就可以了。
      

  2.   

    打错字了
    给你的当前用户授权访问test用户的table表就可以了。 
      

  3.   

    给Test.table创建一个同义次吧,在别的用户底下直接访问
    创建同义词的具体语法是:
    create [public] SYNONYM synooym for object;
    其中synooym表示要创建的同义词的名称,object表示表,视图,序列等我们要创建同义词的对象的名称。如:
    CREATE PUBLIC SYNONYM public_emp FOR jward.emp;           -- jward 用户名
      

  4.   

    感谢楼上各位的帮忙,但问题依旧存在:
    经过验证,建立DBLINK、当前用户已具备sysdba、dba权限、建立同义词三种方式下,提示一样的错误,还是表或视图不存在;
    不用游标,单纯查询 “select * from Test@dblinktmp”、“select * from Test.table”、“select * from public_Test”都是没问题的;难道是dbms_sql.parse检索脚本时根本不考虑跨数据库的各种情况,而只负责本用户下的对象么?
      

  5.   

    你要让test用户可以访问table表 ?
      

  6.   

    楼主还是没有明白吗?
    在同一个Database里面不需要建什么DBlink,只需要你的存储过程具有访问别的用户(schema)的权限,
    也就是说,问题在于你执行存储过程的用户所具有的权限(注意不是角色,角色权限不能应用于存储过程)
    以楼主的问题为例,想要在存储过程中没有限制的select任何一个schema的表,
    存储过程所属的用户必须要具有:select any table的权限。
    具体授权方法:grant select any table to userid;