Извлечение одного столбца в массив - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть таблица, у которой есть 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;

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

Вместо использования 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 голосов
/ 20 декабря 2011

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

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

с. Мне не нравится использовать область ИСКЛЮЧЕНИЯ как часть рабочего процесса программы Я бы сделал:

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