gpt4 book ai didi

sql - PL/SQL - 你能通过索引访问游标中的特定记录吗?

转载 作者:行者123 更新时间:2023-12-05 03:07:44 25 4
gpt4 key购买 nike

我正在尝试编写测试,并给出一组评论,我想将其中的 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;

最佳答案

您可以使用 BOOLEAN 来告诉您是否已经处理了游标的“第一”行,其方式类似于以下内容:

DECLARE
CURSOR c_reviewer_ids IS
SELECT id FROM reviewer_tbl
WHERE course_id = 123;
v_reviewer_id reviewer_tbl.id%TYPE;
bFirst_row BOOLEAN := TRUE;
BEGIN
FOR l_reviewer_id IN c_reviewer_ids
LOOP
IF bFirst_row THEN
bFirst_row := FALSE;

UPDATE reviewer_tbl
SET status = 'Status A'
WHERE id = l_reviewer_id.ID;
ELSE
--Set the status for all other reviewers.
UPDATE reviewer_tbl
SET status = 'Status B'
WHERE reviewer_id = l_reviewer_id.ID;
END IF;

--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;
END;

祝你好运。

编辑

如果你想访问第五行,你可以这样做:

DECLARE
v_reviewer_id reviewer_tbl.id%TYPE;
BEGIN
FOR l_reviewer_id IN (SELECT id, RN
FROM (SELECT ID, ROWNUM AS RN
FROM reviewer_tbl
WHERE course_id = 123)
WHERE RN = 5)
LOOP
UPDATE reviewer_tbl
SET status = 'Status A'
WHERE 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;
END;

祝你好运。

关于sql - PL/SQL - 你能通过索引访问游标中的特定记录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46666001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com