【发布时间】:2017-10-10 11:48:15
【问题描述】:
我正在尝试编写一个测试,并且给定一组评论,我想将其中 1 个设置为“状态 A”,其余所有 设置为'状态 B'。我知道对于 PL/SQL,有一个用于 CURSOR 的 FOR LOOP 语法,我得到了它,所以它可以处理所有评论,但是有没有办法访问该游标中的特定记录?
我认为可以解决我的问题的是一种按索引访问光标的方法,类似于在其他语言中按索引访问数组的方式。 有没有办法在 PL/SQL 中做到这一点?
我对 PL/SQL 和游标的语法还是很陌生,所以我会用伪代码写出我想做的事情。
伪代码
CURSOR c_reviewer_ids IS
SELECT id FROM reviewer_tbl
WHERE course_id = 123;
v_first_id reviewer_tbl.id%TYPE;
FOR i in 0..c_reviewer_ids.length
{
IF i == 0
{
v_first_id := c_reviewer_ids(i);
UPDATE reviewer_tbl
SET status = 'Status A'
WHERE id = c_reviewer_ids(i);
}
ELSE
{
UPDATE reviewer_tbl
SET status = 'Status B'
WHERE id = c_reviewer_ids(i);
}
}
我能够制作一个 CURSOR FOR LOOP,但它处理每条记录的方式相同,我只想为一条记录做一些特别的事情。这是我目前拥有的:
CURSOR FOR LOOP(不处理特殊情况)
CURSOR c_reviewer_ids IS
SELECT id FROM reviewer_tbl
WHERE course_id = 123;
v_reviewer_id reviewer_tbl.id%TYPE;
FOR l_reviewer_id IN c_reviewer_ids
LOOP
--Set the status for all reviewers.
UPDATE reviewer_tbl
SET status = 'Status B'
WHERE reviewer_id = l_reviewer_id.id;
--Save one of the ids; for this particular test, it doesn't matter if it is first or not
v_reviewer_id := l_reviewer_id.id;
END LOOP;
【问题讨论】:
-
你为什么需要一个光标?
case构造不能解决问题吗? -
@dan-bracuk,我不知道测试前的审稿人 ID,所以我无法将它们用作在
case语句中打开的条件。我只关心根据select结果中的一条记录是否以不同方式处理来切换。对于我的具体情况,布尔标志就足够了......也许boolean和case的组合会起作用......
标签: sql oracle for-loop plsql cursor