Скопируйте данные для другой таблицы с помощью таблицы индекса по типам коллекций (связанной с таблицей) - PullRequest
0 голосов
/ 20 февраля 2020

Я не знаю, как создать функцию с типом коллекций. Я знаком с SQL, но я не знаю этой конкретной функции. Вот что я попробовал:

Create or Replace Function COPY_EMPLOYEES_WITH_RT(
  Begin
    insert into jjj_employees ( select * from employees)

Я хочу создать функцию COPY EMPLOYEES_WITH_RT и скопировать данные из таблицы EMPLOYEES в jjj_EMPLOYEES, используя таблицу индекса по типам коллекций (связанную с таблицей) .

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020
CREATE OR REPLACE FUNCTION COPY_EMPLOYEES_WITH_RT(O_ERROR_MESSAGE OUT VARCHAR)
--DECLARE type
  TYPE  EMP_RECORD IS TABLE OF employees%ROWTYPE;
  l_emp  EMP_RECORD;
 -- define cursor
  CURSOR c_employees IS
    SELECT *
    FROM employees;
    --
BEGIN
  --
  open c_employees;
  loop
    fetch c_employees
    bulk collect into l_emp limit 1000;
    exit when l_emp.count = 0;

    -- Process contents of collection here.
    Insert into jrf_employees values l_emp;
  END LOOP;
  CLOSE c_employees;

   EXCEPTION
      --
       WHEN OTHERS THEN
        O_error_message :=  SQLERRM;
END;
/

это как то так, я просто не знал, что не так

0 голосов
/ 20 февраля 2020

Если вы используете объектно-реляционные таблицы и особенно хотите использовать ассоциативные массивы PL / SQL (типы таблиц по индексу), то вы можете создать свои таблицы как:

CREATE TYPE employee_t IS OBJECT(
  id NUMBER(10,0),
  first_name VARCHAR2(20),
  last_name VARCHAR2(20)
);

CREATE TABLE employees OF employee_t (
  id PRIMARY KEY
);

CREATE TABLE jjj_employees OF employee_t (
  id PRIMARY KEY
);

С примером данные:

INSERT INTO employees
SELECT 1, 'One',   'Uno'  FROM DUAL UNION ALL
SELECT 2, 'Two',   'Dos'  FROM DUAL UNION ALL
SELECT 3, 'Three', 'Tres' FROM DUAL;

И функция как:

CREATE FUNCTION COPY_EMPLOYEES_WITH_RT
RETURN NUMBER
IS
  TYPE employee_a IS TABLE OF employee_t INDEX BY PLS_INTEGER;
  emps employee_a;
  i PLS_INTEGER;
BEGIN
  FOR r IN ( SELECT VALUE(e) AS employee FROM employees e )
  LOOP
    emps( r.employee.id ) := r.employee;
  END LOOP;

  i := emps.FIRST;
  WHILE i IS NOT NULL LOOP
    INSERT INTO jjj_employees VALUES ( emps(i) );
    i := emps.NEXT(i);
  END LOOP;

  RETURN 1;
END;
/

Затем вы можете запустить функцию, используя:

BEGIN
  DBMS_OUTPUT.PUT_LINE( COPY_EMPLOYEES_WITH_RT() );
END;
/

И таблица копируется как:

SELECT * FROM jjj_employees;

Выходы:

ID | FIRST_NAME | LAST_NAME
-: | :--------- | :--------
 1 | One        | Uno      
 2 | Two        | Dos      
 3 | Three      | Tres     

дБ <> скрипка здесь


Обновление

Поскольку вы, похоже, хотите использовать коллекцию, а не ассоциативный массив:

CREATE OR REPLACE FUNCTION COPY_EMPLOYEES_WITH_RT
RETURN VARCHAR2
IS
  --DECLARE type
  TYPE  EMP_RECORD IS TABLE OF employees%ROWTYPE;
  l_emp  EMP_RECORD;

  -- DECLARE cursor
  CURSOR c_employees IS
    SELECT *
    FROM employees;

BEGIN
  OPEN c_employees;
  LOOP
    FETCH c_employees
    BULK COLLECT INTO l_emp LIMIT 1000;

    EXIT WHEN l_emp.COUNT = 0;

    -- Process contents of collection here.
    FORALL i IN 1 .. l_emp.COUNT
      INSERT INTO jjj_employees VALUES l_emp(i);
  END LOOP;
  CLOSE c_employees;

  RETURN NULL;
EXCEPTION
  WHEN OTHERS THEN
    RETURN SQLERRM;
END;
/

db <> fiddle

...