如何在oracle plsql中提取和打印函数外的光标值

Posted

技术标签:

【中文标题】如何在oracle plsql中提取和打印函数外的光标值【英文标题】:how to extract & print cursor values outside function in 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 在您的示例中甚至没有被调用。 【参考方案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||','||...);结束循环; 更新答案。

以上是关于如何在oracle plsql中提取和打印函数外的光标值的主要内容,如果未能解决你的问题,请参考以下文章

无法在plsql中打印异常

如何在 PLSQL Developer 中测试包含 DML 的 Oracle 函数?

oracle 10.2.0 如何在plsql 里设置 dbms_output.put_line 打印长度

如何在此代码中正确使用 oracle EXECUTE IMMEDIATE

在 Oracle PLSQL 上打印等效项

如何从 PLSQL Oracle 过程中删除数据或清空游标?