Получить конкретную строку из таблицы типа с моими значениями фильтра - PullRequest
0 голосов
/ 03 января 2019

У меня есть процедура, подобная приведенной ниже:

cursor my_cursor is 
select  first_column, second_column, third_column from table_name;

TYPE my_cursor_type is TABLE OF my_cursor_type%ROWTYPE INDEX BY BINARY INTEGER; 
my_cur  my_cursor_type;

TYPE table_type IS TABLE OF table_name%ROW_TYPE  INDEX BY BINARY INTEGER; 
table_obj  table_type; 

begin 

open my_cursor; 
loop
fetch my_cursor bulk collect 
into my_cur limit 5000;
exit when my_cursor%notfound; 
for i in 1 .. my_cur.count loop   
       table_obj(i).first_column  := my_cur(i).first_column; 
       table_obj(i).second_column := my_cur(i).second_column;   
       table_obj(i).third_column := my_cur(i).third_column;  
     end loop;
  end loop;
  Close my_cursor;

……

Теперь после этих кодов у меня есть table_obj, который имеет запись 100000.И этот объект таблицы имеет first_column, second_column, third_column.

Я ищу третью колонку одной записи в table_obj.Я знаю first_column, second_column и ищу третий_колонку в table_obj.Я должен получить строки из строк table_obj.Эта искомая строка содержит мои значения first_column, second_column.И я получаю Third_column_value из этой строки.Как я могу получить конкретную строку из строк table_obj с помощью plsql?

1 Ответ

0 голосов
/ 06 января 2019

Это можно сделать, преобразовав первые два столбца в один индекс.Конкатенация с разделителем лучше всего подходит для этого.Разделителем должен быть Символ, который не используется ни в одном из первых двух столбцов.

DECLARE
   CURSOR my_cursor
   IS
      SELECT first_column, second_column, third_column FROM table_name;

   TYPE my_cursor_type IS TABLE OF my_cursor_type%ROWTYPE
      INDEX BY BINARY_INTEGER;
   my_cur           my_cursor_type;

   TYPE table_type IS TABLE OF table_name%ROWTYPE
      INDEX BY BINARY_INTEGER;
   table_obj        table_type;

   l_composite_idx  VARCHAR2( 61 );
   l_test_idx_1     VARCHAR2( 30 ) := 'Test1';
   l_test_idx_2     VARCHAR2( 30 ) := 'Success';
BEGIN
   OPEN my_cursor;

   LOOP
      FETCH my_cursor BULK COLLECT INTO my_cur LIMIT 5000;

      FOR i IN 1 .. my_cur.COUNT
      LOOP
         l_composite_idx                             := my_cur( i ).first_column || '&' || my_cur( i ).second_column;

         table_obj( l_composite_idx ).first_column   := my_cur( i ).first_column;
         table_obj( l_composite_idx ).second_column  := my_cur( i ).second_column;
         table_obj( l_composite_idx ).third_column   := my_cur( i ).third_column;
      END LOOP;

      EXIT WHEN my_cursor%NOTFOUND;
   END LOOP;

   CLOSE my_cursor;

   -- You access a row in my_cur like this:
   DBMS_OUTPUT.put_line( 'Result: ' || table_obj( l_test_idx_1 || '&' || l_test_idx_2 ) );
END;

Надеюсь, это поможет!

...