PL / SQL - 迭代游标并赋值

时间:2018-06-05 00:19:26

标签: sql oracle plsql

这可能是一个基本问题,但我对PL / SQL来说相对较新,而且我被卡住了。

我们说我有一个光标,例如:

cursor pr_cur(pr_id varchar2) 
is
  select priority
  from some_table
  where id = pr_id;

优先级列只能有3个可能的值: '低','高','非常高'

我想遍历游标并为变量分配最高优先级:max_pr。

for pr_rec in pr_cur(some_value)
loop
  max_pr := pr_rec.priority;
  exit when pr_rec.priority = 'Very high';
end loop;

我希望这不是一个重复的问题。 我应该怎么做呢?

3 个答案:

答案 0 :(得分:2)

您可以在PL / SQL中尝试:

for pr_rec in pr_cur(some_value)
loop

    CASE pr_rec.priority
        WHEN 'Very high' THEN
            max_pr := pr_rec.priority
        WHEN 'High' THEN
            IF max_pr IS NULL or max_pr = 'Low' THEN
                max_pr := pr_rec.priority
            END IF;
        WHEN 'Low' THEN
            IF max_pr IS NULL THEN
                max_pr := pr_rec.priority
            END IF;
    END CASE;

    exit when max_pr = 'Very high';

end loop;

答案 1 :(得分:2)

需要一个光标,而循环需要一个不需要的if else。您可以使用单个sql查询来使用ORDER BYrow_numberFETCH FIRST

的相应SELECT priority INTO max_pr FROM ( SELECT t.*, ROW_NUMBER() OVER( ORDER BY CASE priority WHEN 'Very high' THEN 1 WHEN 'High' THEN 2 WHEN 'Low' THEN 3 ELSE 4 END ) AS rn FROM some_table t ) WHERE rn = 1; 来获取最高优先级

Oracle 11g

SELECT
    priority
INTO max_pr
FROM
    some_table t
ORDER BY
    CASE priority
        WHEN 'Very high'   THEN 1
        WHEN 'High'        THEN 2
        WHEN 'Low'         THEN 3
        ELSE 4
    END
FETCH FIRST 1 ROWS ONLY

Oracle 12c 及以上

web.xml

答案 2 :(得分:0)

这可能会有所帮助 -

for pr_rec in (select priority
              from some_table
              where id = pr_id)
loop
    max_pr := pr_rec.priority;
    if max_pr= 'Very high' then
        exit;
    end if;
end loop;