【问题标题】:how to extract & print cursor values outside function in oracle plsql如何在oracle plsql中提取和打印函数外的光标值
【发布时间】:2017-05-17 18:03:03
【问题描述】:

我是 pl/sql 的新手。我的怀疑可能是基本的,但我无法找出答案。任何帮助都非常感谢。这是问题。

我创建了一个返回光标的函数。

CREATE OR REPLACE FUNCTION get_empNumber (dept_name varchar2)
    RETURN SYS_REFCURSOR
IS
    l_rc SYS_REFCURSOR;
BEGIN 
    OPEN l_rc FOR
        select DISTINCT emp_NUMBER FROM emp where department_NAME = dept_name;

    RETURN l_rc;
END ;

如果我想通过调用函数来访问上面返回的光标,我应该怎么做?尝试了下面的代码,但它给出了错误。因为我在 Oracle Apex 中尝试这个,它只是说编译错误,不提供任何进一步的错误细节。

DECLARE
    cnumber number;
    CURSOR c1 IS get_bugNumber ('John');
BEGIN
    OPEN c1; 

    LOOP
        FETCH c1 INTO cnumber ;
        EXIT WHEN c1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Emp_No= ' || cnumber );
    END LOOP;

    CLOSE c1;
END;

【问题讨论】:

  • get_empNumber 在您的示例中甚至没有被调用。

标签: oracle plsql oracle-apex


【解决方案1】:

您的函数返回一个引用光标。声明一个并将函数的结果分配给它:

演示功能:

create or replace function f
    return sys_refcursor
as
    c sys_refcursor;
begin
    open c for select 'Hello, world' as text from dual;
    return c;
end f;

测试:

declare
    mycursor sys_refcursor;

    type myrectype is record
        ( text varchar2(100) );
    r myrectype;
begin
    mycursor := f();

    loop
        fetch mycursor into r;
        exit when mycursor%notfound;

        dbms_output.put_line(r.text);
    end loop;

    close mycursor;
end;

【讨论】:

  • 如何打印光标值。由于光标包含 emp 编号列表,以下代码是否正确? mycursor := f(); DBMS_OUTPUT.PUT_LINE(mycursor);
  • 知道了。使用循环。 MyRec 类型是记录 (col1 VARCHAR2(10), col2 VARCHAR2(20), ...); --定义记录rec MyRec; LOOP FETCH refCursor INTO rec;当 refCursor%NOTFOUND 时退出; dbms_output.put_line(rec.col1||','||rec.col2||','||...);结束循环;
  • 更新答案。
猜你喜欢
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多