如何使用Oracle中的dblink调用函数?

3

在Oracle中,是否可以使用DBLINK调用函数?我是这样调用函数并收到错误提示的 - ORA-00904:"MC"。"GET_REFTYPES":无效标识符。

select column_value from table(mc.Get_REFTYPES@READ_MAIN_MCNAV(param1, param2, param3)));

函数代码

CREATE OR REPLACE FUNCTION "MC"."Get_REFTYPES"(
  param1 IN VARCHAR, 
  param2  IN NUMBER, 
  param3  IN DATE DEFAULT SYSDATE
  )
  RETURN RefType_T PIPELINED IS

  CURSOR cur_st (
    cur_param1 VARCHAR, 
    cur_param2  NUMBER,
    cur_param3  DATE
    ) IS
            select 
              TypeID
            FROM ......
          WHERE......... ;

  t_st Types_T;  -- Table variable to store return values       

 BEGIN

    OPEN cur_st(param1, param2 , param3 );
    FETCH cur_st BULK COLLECT INTO t_st;
    CLOSE cur_st;

    FOR i IN 1..t_st.COUNT LOOP
            PIPE ROW(t_st(i));
    END LOOP;
    RETURN;
END;

谢谢!


是的...但我不明白这个函数在这个select语句中是如何被使用的。from table...在where、having、group by或select之外,函数在做什么?你期望这个函数返回什么,查询该如何使用它?作为限制条件还是用于显示?另外,我看到了两个开括号(()和三个闭括号())。 - xQbert
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alex Poole
@Alex Poole mc 是一个模式,我对它和这个函数有完全的访问权限,我可能由于第二个问题而出现了错误。这个函数看起来像这样 - - Kaur
你会遇到那个链接问题,因为 SD_SchoolType_T UDT。但这并不能解释你在到达那一点之前遇到的 ORA-00904 错误。 - Alex Poole
@Alex,我在尝试编辑代码时搞砸了...名字是正确的。 - Kaur
所以函数名实际上是使用你展示的引号标识符吗?mc."Get_REFTYPES"@READ_MAIN_MCNAV() 能够工作吗? - Alex Poole
1个回答

7

该函数使用带引号的标识符进行声明:

CREATE OR REPLACE FUNCTION "MC"."Get_REFTYPES"(

您称其为未引用,如mc.Get_REFTYPES@READ_MAIN_MCNAV(...)。引号标识符带来的烦恼之一是您总是需要用引号并且与原始定义完全相同的大小写来引用它们,因此您需要执行以下操作:

select column_value
from table(mc."Get_REFTYPES"@READ_MAIN_MCNAV(param1, param2, param3)));

您不需要引用mc,因为带引号的大写标识符的行为与未引用的标识符相同。
但即使进行了更正,这也无法实现您想要的功能。如此答案中所讨论的那样,您不能调用返回用户定义类型(如RefType_T)的函数,并且将收到“ORA-30626:不支持远程对象类型的函数/过程参数”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接