2011-12-19 3 views
2

У меня есть таблица, которая имеет column_id типа varchar2. Эта таблица может содержать 1, 0 или несколько строк. Моя бизнес-логика зависит от каждого случая.Извлечение одной колонки в массив

Я пытаюсь извлечь столбец в массив, но я получаю странные ошибки (учитывая мое ограниченное знание PL/SQL)

TYPE t_col_id IS TABLE OF TEST_TABLE.COLUMN_ID%TYPE INDEX BY BINARY_INTEGER; 
    AR_COL_ID T_COL_ID; 

Тогда я пытаюсь получить данные в этом массиве

SELECT COLUMN_ID INTO AR_SIM_ID FROM TEST_TABLE WHERE COLUMN_ID = 1;

и я получаю эту ошибку

Error(7,3): PL/SQL: SQL Statement ignored 
Error(7,25): PLS-00597: expression 'AR_SIM_ID' in the INTO list is of wrong type 
Error(7,35): PL/SQL: ORA-00904: : invalid identifier 

Есть ли что-то, что мне не хватает? Мой исходный код будет использовать этот массив в качестве

BEGIN 
    -- FETCH ARRAY QUERY 
    IF (AR_SIM_ID.LENGTH = 0) THEN 
     -- BUSINESS LOGIC 1 
    ELSE 
     -- BUSINESS LOGIC 2 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
     -- BUSINESS LOGIC 3 
END; 

ответ

4

Вместо использования INTO вы должны использовать BULK COLLECT INTO:

DECLARE 
    TYPE t_col_id IS TABLE OF TEST_TABLE.COLUMN_ID%TYPE INDEX BY BINARY_INTEGER; 
    AR_COL_ID T_COL_ID; 
BEGIN 
    SELECT COLUMN_ID 
    BULK COLLECT INTO AR_SIM_ID 
    FROM TEST_TABLE 
    WHERE COLUMN_ID = 1; 

    IF AR_SIM_ID.LENGTH = 0 THEN 
     -- BUSINESS LOGIC 1 
    ELSE 
     -- BUSINESS LOGIC 2 
    END IF; 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     -- BUSINESS LOGIC 3 
END; 

Но не могли бы вы просто использовать COUNT для этого сценария?

DECLARE 
    numRows NUMBER; 
BEGIN 
    SELECT COUNT(COLUMN_ID) 
    INTO numRows 
    FROM TEST_TABLE 
    WHERE COLUMN_ID = 1; 

    IF numRows = 0 THEN 
     -- BUSINESS LOGIC 1 
    ELSE 
     -- BUSINESS LOGIC 2, 3, etc... 
    END IF; 
END; 
+0

Дело в том, что мой запрос использует по крайней мере 4 соединения. Запрос тяжелый. Если есть данные (1 запись), мне нужно будет использовать значение этой записи для «обновления». Если есть несколько данных, тогда мне нужно обновить некоторую другую таблицу для нескольких запросов. Если данных нет, тогда мне нужно «вставить» новую запись. Поэтому, если я использую запрос count, тогда в случае, когда число равно 1, мне придется повторно запустить запрос, чтобы получить его значение, чтобы я мог обновить. –

+1

@ x.509 ах, я вижу, поэтому я считаю, что 'BULK COLLECT' решит вашу проблему? – wweicker

+0

действительно это будет :) спасибо –

0

a. Если вы хотите получить все строки в таблице plsq - вам нужно набрать сбор b. Если вы просто хотите узнать, сколько строк в таблице вы должны сделать:

SELECT count(*) INTO v_count from TEST_TABLE where COLUMN_ID = 1; 

c. Я не люблю использовать сферу EXCEPTION в рамках Workflow- программы я хотел бы сделать:

IF v_count = 0 THEN 
-- BUSINESS LOGIC 1 
ELSIF v_count = 1 THEN 
-- BUSINESS LOGIC 2 
ELSE 
-- BUSINESS LOGIC 3 
END IF; 
+0

Я не хочу брать *. Всего 1 столбец, который может быть кратным значениям. а во-вторых, что, если в таблице есть ** NO_DATA **? исключение 'NO_DATA_FOUND' будет выбрано, и я должен написать там свою бизнес-логику. –

+0

первый - насколько я понимаю, вы не хотите подсчет (отчетливый col), так почему это имеет значение? во-вторых - когда вы используете count(), вы не получаете исключение no_data_found, вы получаете 0 вместо ... и в-третьих - вы всегда можете использовать опцию a - сбор массы –