For loop pl/sql循环记录选择oracle plsql

For loop pl/sql循环记录选择oracle plsql,for-loop,plsql,oracle11g,conditional,procedure,For Loop,Plsql,Oracle11g,Conditional,Procedure,我有一个select语句,我正在尝试循环,并根据select语句的条件递增一个变量,然后将该变量作为out返回,以便在一些前端代码中使用它。我正在使用oracle 11g,我正在寻找一些方法来做到这一点。。。但我不确定哪种方法最好。下面我有一些我正在尝试做的事情,但由于混乱再次停止了 首先,我要设置进程和“in变量” PROCEDURE SEEKER (pMonkeyID IN Number, vMarkCounter OUT Number) AS BEGIN CURSOR seeker_cu

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

首先,我要设置进程和“in变量”

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代码(如下所示):


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

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

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;

在我看来,解决您的问题的方法可能很简单:

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是(几乎总是)最有效的方法。调用循环的逐行执行“缓慢进行”。

这里不使用COUNT()有什么原因吗?为什么要循环呢?
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;