如何在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 Developer 中测试包含 DML 的 Oracle 函数?
oracle 10.2.0 如何在plsql 里设置 dbms_output.put_line 打印长度