Może to być podstawowe pytanie, ale jestem stosunkowo nowy w PL / SQL i utknąłem.

Powiedzmy, że mam kursor, na przykład:

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

Kolumna priorytetowa może mieć tylko 3 możliwe wartości: "niski", "wysoki", "bardzo wysoki"

Chcę iterować przez kursora i przypisać najwyższy priorytet znaleziony do zmiennej: 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;

Mam nadzieję, że nie jest to zduplikowane pytanie. Jak mam to zrobić?

1
yarex 5 czerwiec 2018, 03:19

3 odpowiedzi

Najlepsza odpowiedź

Ty nie Potrzebujesz pętli kursora i dla tego z niechcianymi {x0}}. Możesz użyć pojedynczego zapytania SQL, aby uzyskać maksymalny priorytet za pomocą odpowiedniego {x1}} za pomocą row_number lub FETCH FIRST

W Oracle 11g

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 12c i powyżej

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
2
Kaushik Nayak 5 czerwiec 2018, 04:12

Możesz spróbować tego w swoim 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;
2
Shuwn Yuan Tee 5 czerwiec 2018, 01:02

To może pomóc ...

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;
0
Atul Kr Dey 5 czerwiec 2018, 03:47