【问题标题】:fetch from function returning a ref cursor to record从返回引用游标记录的函数中获取
【发布时间】:2010-11-09 13:03:58
【问题描述】:

我在一个包中有一个函数,它可以将 REF CURSOR 返回到 RECORD。我正在尝试从代码块中调用此函数。调用代码如下:

declare      
   a_record package_name.record_name; 
   cursor c_symbols is select package_name.function_name('argument') from dual;

begin 
   open c_symbols;   
   loop            
        fetch c_symbols into a_record;
        exit when c_symbols%notfound;              
   end loop;
   close c_symbols; 
end;

作为 package_name 一部分的函数声明如下所示:

TYPE record_name IS RECORD(
      field_a       varchar2(20);
);

TYPE record_cursor IS REF CURSOR RETURN record_name;

FUNCTION getsymbols(argument IN varchar2) return record_cursor;

当我尝试运行调用代码块时,出现异常:PLS-00386: type mismatch found at 'EXAMPLE_SYMBOLS' between FETCH cursor and INTO variables。

a_record 的类型应该是什么以及如何访问我正在获取的记录的各个元素(类型为 record_name)?

【问题讨论】:

    标签: sql oracle plsql oracle10g


    【解决方案1】:

    我怀疑您认为您的游标应该从 REFCURSOR 获取行。它不是。 REFCURSOR 本身就是一个游标,您不需要使用其他游标从中进行选择。

    您当前的游标正在做的是获取包含函数调用结果的单行和单列。哪个是record_cursor 而不是record_name,所以你会得到类型不匹配。

    我怀疑你真正想做的是这样的:

    declare
      symbol_cursor  package_name.record_cursor;
      symbol_record  package_name.record_name;
    begin
      symbol_cursor := package_name.function_name('argument');
      loop
        fetch symbol_cursor into symbol_record;
        exit when symbol_cursor%notfound;
    
        -- Do something with each record here, e.g.:
        dbms_output.put_line( symbol_record.field_a );
    
      end loop;
    
      CLOSE symbol_cursor;
    
    end;
    

    【讨论】:

    • 如果我的函数将游标返回到多条记录怎么办?有什么方法可以遍历这些记录。
    • 这正是上面的代码要做的——处理所有可以从返回的游标中获取的行。
    【解决方案2】:

    读取 ref 游标的 pl/sql 块对我来说有点奇怪。 Oracle 可能无法将光标c_symbols 的类型与package_name.record_cursor 类型匹配。

    建议:

    • c_symbols的声明改为“c_symbols package_name.record_cursor
    • 将语句“open c_symbols”替换为“c_symbols := package_name.function_name('argument')

    只要被调用的函数确实返回了一个游标,那应该可以工作。 否则,您可能想发布实际的源代码。

    【讨论】:

      【解决方案3】:

      该函数返回一个record_cursor,所以我希望a_record 也应该是一个record_cursor。但是,尚不清楚您为什么要返回 ref 游标 - 为什么函数不能返回 record_name 类型呢?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 2012-04-03
        • 1970-01-01
        相关资源
        最近更新 更多