Oracle: объявить несколько констант и использовать их в предложении WHERE - PullRequest
0 голосов
/ 08 января 2020

Я выполняю ежедневные извлечения из той же таблицы. Единственное, что когда-либо меняется, это диапазон столбца с именем SAMPLE_ID, поэтому я хотел бы присвоить фиксированное значение двум переменным: id_min и id_max, чтобы я мог обновить их значения перед выполнением запроса.

Я попробовал следующее:

DECLARE
    id_min  CONSTANT INTEGER := 17778;
    id_max  CONSTANT INTEGER := 17803;
BEGIN
    SELECT
        *
    FROM
        MDB.SCORES
    WHERE
        SAMPLE_ID BETWEEN id_min AND id_max;
END;

Я ожидал, что этот код будет использовать числа, присвоенные id_min и id_max в качестве нижней и верхней границ функции BETWEEN в WHERE, но я получаю это сообщение:

ORA-06550: line 6, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement

Кажется, кто-то сталкивался с чем-то похожим в этой теме , но я не понимаю предложенные решения.

Ответы [ 4 ]

3 голосов
/ 08 января 2020

Поскольку вы выполняете код PL / SQL, вы не можете просто выполнить запрос SELECT, не сделав с ним что-либо.

Есть несколько способов обработки запросов на выборку в PL / SQL.

1) INTO, где вы берете строку, возвращенную из запроса, и присваиваете ее переменным. * Обратите внимание на указанную строку, а не на строки. Если ваш запрос возвращает более одной строки, вы не можете использовать предложение INTO, поскольку оно сгенерирует исключение TO_MANY_ROWS.

DECLARE
    id_min  CONSTANT INTEGER := 17778;
    id_max  CONSTANT INTEGER := 17803;
    variable1 your_variable_type;
    variable2 your_variable_type;
    variable3 your_variable_type;
BEGIN
    SELECT
        *
    INTO
        variable1,
        variable2,
        variable3
    FROM
        MDB.SCORES
    WHERE
        SAMPLE_ID BETWEEN id_min AND id_max;

    ---- DO SOMETHING WITH YOUR VARIABLES ----    
END;

2) FOR l oop, если у вас есть одна или несколько строк.

DECLARE
    id_min  CONSTANT INTEGER := 17778;
    id_max  CONSTANT INTEGER := 17803;
BEGIN

    FOR c IN (
        SELECT
            *
        FROM
            MDB.SCORES
        WHERE
            SAMPLE_ID BETWEEN id_min AND id_max
    ) LOOP
        ---- DO SOMETHING WITH YOUR VARIABLES ----  
        ---- ACCESS A COLUMN ----

        c.column_name;

    END LOOP;
END;

3) CURSOR декларирование.

DECLARE
    id_min  CONSTANT INTEGER := 17778;
    id_max  CONSTANT INTEGER := 17803;
    v_cursor SYS_REFCURSOR;
    your_variables
    ...
BEGIN

    OPEN v_cursor FOR
        SELECT
            *
        FROM
            MDB.SCORES
        WHERE
            SAMPLE_ID BETWEEN id_min AND id_max;
    LOOP
        FETCH v_cursor INTO your_variables;
        EXIT WHEN v_cursor%NOTFOUND;

        ---- DO SOMETHING WITH YOUR VARIABLES ----  

    END LOOP;
END;
1 голос
/ 08 января 2020

Возможно, вам будет проще использовать переменные связывания и вообще не запускать запрос в PL / SQL.

var id_min NUMBER
var id_max NUMBER

begin
  :id_min := 17778;
  :id_max := 17803;
end;
/

SELECT
    *
FROM
    MDB.SCORES
WHERE
    SAMPLE_ID BETWEEN :id_min AND :id_max;
1 голос
/ 08 января 2020

Как только вы находитесь между BEGIN и END, вы больше не в SQL, а в PL SQL.

В PL / SQL нет просто оператора выбора, есть "выбор" Вместо этого ... INTO ... ".

Другими словами, база данных требует от вас переменной для сохранения результатов в.

Или вы можете использовать al oop для оперировать данными. Ниже приведен пример l oop для печати данных из some_column out

DECLARE
     id_min  CONSTANT INTEGER := 17778;
    id_max  CONSTANT INTEGER := 17803;
BEGIN
  for score in (SELECT *
                  FROM MDB.SCORES
                 WHERE SAMPLE_ID BETWEEN id_min AND id_max) loop
    dbms_output.put_line(sc.some_column_name);
  end loop;
END;
0 голосов
/ 17 января 2020

Я не осознавал, DECLARE потребует PL/SQL. Мне было проще сделать следующее, используя DEFINE.

DEFINE id_min = 17778
DEFINE id_max = 17803;

SELECT
    *
FROM
    MDB.SCORES
WHERE
    SAMPLE_ID BETWEEN &id_min AND &id_max;
...