【问题标题】:pl/sql loop records select oracle plsqlpl/sql 循环记录选择 oracle plsql
【发布时间】:2012-02-26 21:38:00
【问题描述】:

我有一个 select 语句,我试图循环并根据 select 语句的条件增加一个变量,然后将变量作为 out 返回,以便我可以在一些前端代码中使用它。我正在使用 oracle 11g,我看到了几种方法可以做到这一点......但我不确定哪种方法是最好的。我在下面有一些我正在尝试做的事情,但由于混乱再次停止。

首先我设置我的 proc 和'in variable'

PROCEDURE SEEKER (pMonkeyID IN Number, vMarkCounter OUT Number)
AS
BEGIN

CURSOR seeker_cur IS
    Select Mokney_approved, Monkey_vaulted 
    from MonkeyBookApps 
    where MonkeyID = pMonkeyID
    and Monkey_doc_type = 'BANANA' 
    order by docu_approv_timestamp,monkey_doc_type,monkey_doc_approved desc

OPEN seeker_cur;

begin

   OPEN Seeker_cur;
   vMarkCounter := 0;

这是我不确定的部分。如果不满足条件,我应该循环然后退出,还是应该执行 if 语句并以某种方式确定是否存在可能大于 1 的记录?如果是这样,那将如何工作?做一种方式比另一种方式有好处吗?所以...我要对我正在尝试做的事情进行 sudo 编码(如下):

FOR (however many records) in Seeker_cur
IF seeker_cur (not found) or (returns no records)

EXIT or (break for loop);
ELSE
LOOP

vMarkCounter := vMarkCounter + 1;

EXIT WHEN seeker_cur is out of records (somehow)
END IF;
END LOOP;

END; 
END SEEKER;

我相信有几种方法可以做到这一点。你会建议什么方法?

【问题讨论】:

  • 这里没有使用 COUNT() 有什么原因吗?为什么要循环?

标签: for-loop plsql oracle11g conditional procedure


【解决方案1】:

为什么不使用隐式游标,它会自己打开和关闭:

DECLARE

CURSOR seeker_cur IS
    Select Mokney_approved, Monkey_vaulted 
    from MonkeyBookApps 
    where MonkeyID = pMonkeyID
    and Monkey_doc_type = 'BANANA' 
    order by docu_approv_timestamp,monkey_doc_type,monkey_doc_approved desc;

  vMarkCounter number:=0;

BEGIN

  FOR i IN seeker_cur 
  LOOP
    vMarkCounter := vMarkCounter+1;
  END LOOP;

  dbms_output.put_line(vMarkCounter);
END;

【讨论】:

    【解决方案2】:

    在我看来,您的问题的解决方案可能就像这样简单:

    SELECT COUNT(*)
    INTO   l_some_local_variable
    FROM   monkey_book_apps 
    WHERE  monkey_id = p_monkey_id
       AND monkey_doc_type = 'BANANA';
    
    RETURN l_some_local_variable;
    

    避免 PL/SQL 循环并尽可能使用最简单的 SQL 是(几乎总是)最有效的方法。 Tom Kyte 将 LOOP 的逐行执行称为“逐行缓慢”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 2019-04-06
      • 1970-01-01
      • 2020-05-29
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多