PLSQL使用游标或函数查询重复数据

Posted

技术标签:

【中文标题】PLSQL使用游标或函数查询重复数据【英文标题】:PLSQL using cursors or functions to query repeated data 【发布时间】:2014-11-17 03:28:43 【问题描述】:

将常用的查找查询声明为包函数还是函数(返回行或值或返回 sysref 游标)更好? 有什么不同? 最佳实践是什么? 其他考虑因素是什么? 还是有其他更好的方法?

1) 使用包光标

cursor getLicenseStatus_cur (in_license_no varchar2) is
    SELECT status, status_dt from tbl_license where licence_no=in_license_no;

--use:
OPEN getLicenseStatus_cur('123');
fetch getLicenseStatus_cur into l_status, l_status_dt;
EXIT WHEN sql%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('l_status= ' || l_status || ', l_status_dt= ' || l_status_dt);
close getLicenseStatus_cur('123');

2) 或使用函数并传递行类型

create or replace function getLicenseStatus(in_license_no varchar2(10))
RETURN tbl_license%ROWTYPE
    as
    output_rec tbl_license%ROWTYPE;
begin
    SELECT * into output_rec 
    from tbl_license where licence_no=in_license_no;
    return output_rec;
end;

--use
lic_rec users%ROWTYPE;
lic_rec := getLicenseStatus('123');
DBMS_OUTPUT.PUT_LINE('l_status= ' || lic_rec.status || ', l_status_dt= ' || lic_rec .status_dt);

3) 或使用函数并传递 sys refcursor

create or replace function getLicenseStatus(in_license_no varchar2(10)) 
return sys_refcursor as
    v_curs sys_refcursor;
begin
    open v_curs for SELECT status, status_dt from tbl_license where licence_no=in_license_no;
    return v_curs;
end;

--use:
v_rc := getLicenseStatus('123'); 
fetch v_rc into l_status , l_status_dt;
exit when sql%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('l_status= ' || l_status || ', l_status_dt= ' || l_status_dt);
close v_rc ;

【问题讨论】:

对于任何给定的license_no,您是否希望查询准确返回 1 行?还是您希望查询返回多行? 本例中为一行。 license_no 将是主键。 【参考方案1】:

由于您知道查询应该总是准确地返回 1 行,因此返回 %ROWTYPE 的函数更有意义。如果返回 0 行或返回多于 1 行(这听起来是正确的行为),这会引发异常。这也使调用代码更简单,因为您不需要处理对游标的迭代。

【讨论】:

以上是关于PLSQL使用游标或函数查询重复数据的主要内容,如果未能解决你的问题,请参考以下文章

用于使用序列消除重复条目的 Oracle PLSQL 更新查询

plsql子查询查出多行怎么修改

PLSQL--游标

sqlserver存储过程中使用游标,查询结果没有第一条数据,但循环次数是对的,不过后面两条数据重复,请教啊

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

PLSQL - 如何计算动态查询返回的列数[重复]