Как использовать API таблиц Oracle для вставки данных из одной таблицы в другую с использованием PL / SQL? - PullRequest
0 голосов
/ 08 июня 2018

Я довольно новичок в Oracle.Мне нужно знать, как использовать процедурный язык для вставки данных из одной таблицы в другую, используя Cursor and Table API .Я много искал и пришел сюда.Например, давайте возьмем сценарий сотрудников, нам нужно извлечь все данные сотрудников из таблицы сотрудников и вставить его в таблицу с именем «employee_backup».Мне нужно знать, как это можно реализовать с помощью Cursor, Table API с лучшими практиками программирования.Я сделал следующее. но я не сделал реализацию курсора и реализацию API таблицы. Итак, подскажите мне, как это сделать.

Спецификация пакета:

 create or replace employee_package 
 AS
 procedure getemployees(department_id IN NUMBER);

Я передаю отдел_для получениятолько сотрудники конкретного отдела.

Тело пакета:

 CREATE OR REPLACE
 PACKAGE BODY employee_package AS
 PROCEDURE getemployees(department_id IN NUMBER) AS
 BEGIN
 INSERT INTO employees_backup select * from employees WHERE 
 department_id = department_id;
 END employee_package;

Это делается без использования Table API.Мне нужно знать, как реализовать это с помощью Table API.Если можно использовать курсор, включая реализацию курсора.Надеюсь, я объяснил вопрос достаточно хорошо, чтобы не быть помеченным.

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете кодировать в следующих строках:

CREATE OR REPLACE PACKAGE employee_package AS
  PROCEDURE getemployees(p_department_id IN NUMBER);
  PROCEDURE getmanyemployees(p_department_id IN NUMBER);
  PROCEDURE getfastemployees(p_department_id IN NUMBER);
END employee_package;
/

Это подразумевает 3 процедуры для сравнения (предпочтительного) простого SQL и метода массового сбора курсора.

CREATE OR REPLACE PACKAGE BODY employee_package AS

  PROCEDURE getfastemployees(p_department_id IN NUMBER) AS
  BEGIN
    INSERT INTO backup_employees e
    SELECT * FROM employees WHERE department_id = p_department_id;
  END getfastemployees;

  PROCEDURE getemployees(p_department_id IN NUMBER) AS
    TYPE emp_type IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
    emp_array emp_type;
  BEGIN
    SELECT * 
      BULK COLLECT INTO emp_array
      FROM employees
     WHERE department_id = p_department_id;

    FORALL i IN 1 .. emp_array.COUNT
      INSERT INTO backup_employees VALUES emp_array(i);          
  END getemployees;

  PROCEDURE getmanyemployees(p_department_id IN NUMBER) AS

    CURSOR cur (c_department_id NUMBER) IS 
    SELECT * 
      FROM employees 
     WHERE department_id = c_department_id;

    TYPE emp_type IS TABLE OF cur%ROWTYPE;
    emp_array emp_type;
  BEGIN
    OPEN cur(p_department_id);
    LOOP
      FETCH cur BULK COLLECT INTO emp_array LIMIT 1000; 

      FORALL i IN 1..emp_array.COUNT
        INSERT INTO backup_employees VALUES emp_array(i);

      EXIT WHEN cur%NOTFOUND;
    END LOOP;
    CLOSE cur;
    COMMIT;
  END getmanyemployees;

END employee_package;
/

Для 100.000сотрудники, getfastemployeeses (50) занимает 0,88 с, getmanyemployees 1,54, а getemployeeses 9,5 с.Интересно, что 2,7 миллиона сотрудников getfastemployeees и getmanyemployees все еще находятся в одном регионе.

См. Также массовый сбор ... для любого использования и т. Д.

...