gpt4 book ai didi

sql - 如何使用 out sys_refcursor 参数执行 oracle 过程?

转载 作者:行者123 更新时间:2023-12-01 22:35:34 27 4
gpt4 key购买 nike

我的包体中有一个过程:

create or replace package body MYPACKAGE is

procedure "GetAllRules"(p_rules out sys_refcursor)
is
begin
open p_rules for
select * from my_rules;

end "GetAllRules";

-- etc

我在我的包规范中公开了这一点。

如何在 PL SQL Developer(或类似工具)的新 SQL 窗口中执行此过程?

最佳答案

您可以相对轻松地执行该过程

DECLARE 
l_rc sys_refcursor;
BEGIN
mypackage."GetAllRules"( l_rc );
END;

当然,这只是将光标返回给调用应用程序。它不会执行任何从游标中获取数据、对该数据执行某些操作或关闭游标的操作。假设您的目标是将一些数据写入 dbms_output(这有时对原型(prototype)设计很有用,但不是生产代码应该依赖的东西),您可以做类似的事情

DECLARE 
l_rc sys_refcursor;
l_rec my_rules%rowtype;
BEGIN
mypackage."GetAllRules"( l_rc );
LOOP
FETCH l_rc INTO l_rec;
EXIT WHEN l_rc%NOTFOUND;

dbms_output.put_line( <<print data from l_rec>> );
END LOOP;

CLOSE l_rc;
END;

如果你真的在 PL/SQL 中用游标做这样的事情,我强烈建议返回一个强类型的引用游标而不是弱类型的引用游标,这样你就可以根据cursor 的 %rowtype 而不是强制调用者确切知道要声明的类型并希望过程中的查询不会更改。这还需要您显式编写代码来显示令人讨厌的数据。

如果您正在使用 SQL*Plus(或支持某些 SQL*Plus 命令的东西),您可以稍微简化一下

VARIABLE rc REFCURSOR;
EXEC mypackage."GetAllRules"( :rc );
PRINT :rc;

顺便说一句,我不喜欢使用区分大小写的标识符。每次你想调用它时,都必须用双引号将 "GetAllRules" 之类的标识符括起来,这已经很老了。除非你有真正令人信服的理由,否则我建议使用标准的不区分大小写的标识符。在您的代码中合理地使用大写标识符是完全合理的,当然,强制它们在数据字典中区分大小写的努力没有多大意义。

关于sql - 如何使用 out sys_refcursor 参数执行 oracle 过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24028914/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com