For loop pl/sql循环记录选择oracle plsql
我有一个select语句,我正在尝试循环,并根据select语句的条件递增一个变量,然后将该变量作为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
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;