Как использовать PL / SQL Record Datatype во вложенной таблице? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть вложенная таблица, которая содержит тип данных записи. Поэтому я попытался:

DECLARE
  TYPE my_nested_table   IS TABLE OF ot.employee%ROWType;
  var_nt  my_nested_table :=  my_nested_table ();

  cursor cur is 
  select * from ot.employee;

BEGIN
 for i in cur
 loop
 var_nt.extend;
  end loop;

END;
/

Таблица employee имеет empno,empname,job columns. Это неправильный процесс, или я могу сохранить эту запись во вложенной таблице? Я не получаю никакой ошибки при компиляции этого кода. Как добавить все эти значения курсора в переменную вложенной таблицы и напечатать их?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

как добавить все эти значения курсора в переменную вложенной таблицы и распечатать их?

Используя LOOP, вы можете присваивать значения одно за другим, как показано ниже: Использование Nested Таблица

DECLARE
  TYPE my_nested_table IS  TABLE OF employee%rowtype;
  cursor cur is 
        select *
        from employee;

  var_nt   my_nested_table := my_nested_table ();
BEGIN
  for i in cur 
  loop
    var_nt.extend;        
    var_nt(var_nt.count)   := i; -- Assignment 
    --Printing. You can add the columns you want
    dbms_output.put_line(i.empno ||'-'|| i.ename||'-'||i.sal||'-'|| i.deptno);
  end loop;
END;
/

Использование Associative Array: - Что может спасти вас от инициализации и расширения

DECLARE
  TYPE my_nested_table IS  TABLE OF employee%rowtype index by pls_integer;
  cursor cur is 
        select *
        from employee;

  var_nt   my_nested_table; -- No need to initialize
BEGIN
  for i in cur loop
    --var_nt.extend; -- No need to extend
    var_nt(var_nt.count)   := i;
    dbms_output.put_line(i.empno ||'-'|| i.ename||'-'||i.sal||'-'|| i.deptno);
  end loop;
END;
/

Во-вторых, вы можете избежать loop и получить значения непосредственно в Nestedтаблица как показано ниже:

DECLARE
  TYPE my_nested_table IS  TABLE OF employee%rowtype;
  var_nt   my_nested_table := my_nested_table ();
BEGIN
  select * 
  BULK COLLECT INTO  var_nt
  from employee;

  for i in 1..var_nt.count Loop
    dbms_output.put_line('Employee No. - '||var_nt(i).empno||'  '||'Employee Name - '||var_nt(i).ename);
  end loop;

END;
/
0 голосов
/ 05 ноября 2019

Не уверен, что я понимаю, но вы можете сделать это:

DECLARE

  CURSOR c_data IS
    SELECT *
    FROM employee;
  tmp_event c_data%rowtype;

BEGIN
  OPEN c_data;
  LOOP
    FETCH c_data INTO tmp_event;
    EXIT WHEN c_data%NOTFOUND;
    dbms_output.put_line(tmp_event.id);
  END LOOP;
  CLOSE c_data;
END;
/

Вот это ДЕМО

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