首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将游标的SELECT查询转换为在PL/SQL存储过程中完全运行?

如何将游标的SELECT查询转换为在PL/SQL存储过程中完全运行?
EN

Stack Overflow用户
提问于 2019-08-06 13:11:31
回答 1查看 2.1K关注 0票数 1

我在Oracle 12中有一个缓慢的存储过程,我想看看是否可以进行优化。它以输出游标的形式返回多个查询结果。我想我应该使用Allround /SQL Developer中的profile工具来分析这个过程,但是我意识到执行这个过程并不会计算(迭代)输出游标,所以我的概要文件不会给我带来任何有趣的东西。

如何修改我的存储过程以简单地完全评估游标?在Server中,过程中可能只包含裸露的SELECT语句,但看起来在PL/SQL过程中这是不可能的。如何修改游标的SELECT查询的PL/SQL以全面评估PL/SQL存储过程中的SELECT,以便全面分析该过程?

我认为我正在与Oracle范式(而不是Server )进行斗争,所以如果我认为这是错误的,我很乐意听到它。

代码语言:javascript
复制
    CREATE OR REPLACE PROCEDURE sp_my_proc(
        /* ... */
        out_my_cursor OUT SYS_REFCURSOR) IS 
    BEGIN 
        /* ... */
        OPEN out_my_cursor FOR
        SELECT ... FROM ... ; -- I want to profile this whole proc including this SELECT
    END sp_my_proc;
EN

回答 1

Stack Overflow用户

发布于 2019-08-06 13:28:57

这里是一个最小的示例,您如何在PL/SQL中从返回的游标中获取所有行。

添加您的输入参数和游标中返回的附加列

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE sp_my_proc(
    out_my_cursor OUT SYS_REFCURSOR) IS 
BEGIN 
    OPEN out_my_cursor FOR
    SELECT rownum ID FROM dual connect by level <= 5; 
END sp_my_proc;
/    


declare
cv_out sys_refcursor; 
--  
v_id   NUMBER;
begin
         sp_my_proc(cv_out);
         /* to read the cursor use fetch in a loop */
         LOOP
            FETCH cv_out INTO v_id;
            EXIT WHEN cv_out%NOTFOUND;
            dbms_output.put_line( 'ID= '|| v_ID   ); 
        END LOOP;       
end;
/  

在从游标中获取行时,主要的困难是在FETCH INTO 子句中定义变量.

Oracle提供了两个选项来简化此任务。

如果光标列与表或视图对应1:1,则可以使用名称%ROWTYPE

示例

代码语言:javascript
复制
v_cur   tab%ROWTYPE;
BEGIN 
    OPEN out_my_cursor FOR
    SELECT col1, col2 FROM tab;  /* tab has two columns */

更多的话,你需要一般情况下的光标%ROWTYPE

但不幸的是,这不能与动态游标一起使用,所以您必须明确声明游标(从过程中复制它)。

代码语言:javascript
复制
declare
 CURSOR cur is
    SELECT col1, col2 FROM tab;  /* tab has more than two columns */
 v_cur cur%ROWTYPE;
begin
         OPEN cur;
         LOOP
            FETCH cur INTO v_cur;
            EXIT WHEN cur%NOTFOUND;
             dbms_output.put_line( 'col1= '|| v_cur.col1   );
         END LOOP;       
end;
/ 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57376886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档