2017-02-01 5 views
0

Я заполнил ассоциативный массив информацией из курсора, и теперь я хотел бы вставить ассоциативную информацию массива в таблицу. Как это возможно? Рассмотрим, что ассоциативный массив был создан из записи.Как вставить данные в таблицу с помощью ассоциативного массива?

SET SERVEROUTPUT ON 

DECLARE 
    TYPE rec_depts_info IS RECORD(
     v_dept_id departments.department_id%TYPE, 
     v_dept_name departments.department_name%TYPE); 
    TYPE typ_depts_info IS TABLE OF rec_depts_info 
     INDEX BY PLS_INTEGER; 

    CURSOR cur_depts_info_1 
    IS 
    SELECT department_id, department_name 
    FROM departments 
    WHERE department_id IS NOT NULL 
    AND department_name IS NOT NULL; 

    t_depts_info_1 typ_depts_info; 
    rec_depts_info_1 rec_depts_info; 

    v_counter_1 PLS_INTEGER := 1; 
    v_counter_2 PLS_INTEGER := 1; 
BEGIN 
    v_counter_1 := v_counter_1 + 1; 

    FOR depts_info IN cur_depts_info_1 
    LOOP 
     t_depts_info_1(v_counter_1).v_dept_id := depts_info.department_id; 
     t_depts_info_1(v_counter_1).v_dept_name := depts_info.department_name; 

     EXIT WHEN cur_depts_info_1%NOTFOUND; 

    END LOOP; 

    LOOP 
    INSERT INTO tabla_pruebas 
    VALUES(t_depts_info_1(v_counter_2).v_dept_id, 
      t_depts_info_1(v_counter_2).v_dept_name) 
    RETURNING column_1, column_2 
    INTO  rec_depts_info_1.v_dept_id, rec_depts_info_1.v_dept_name; 

    DBMS_OUTPUT.PUT_LINE('DEPT ID: ' || rec_depts_info_1(v_counter_2).v_dept_id 
         || ' DEPT NAME: ' || 
         rec_depts_info_1(v_counter_2).v_dept_name); 

    v_counter_2 := v_counter_2 + 1; 

    EXIT WHEN SQL%NOTFOUND; 
    END LOOP; 
END; 

Я пытаюсь вставить данные в новый таб, используя простой LOOP, но я получил следующее сообщение об ошибке:

Informe de error - 
ORA-06550: line 51, column 41: 
PLS-00222: no function with name 'REC_DEPTS_INFO_1' exists in this scope 
ORA-06550: line 51, column 5: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

Спасибо !!!

+0

Какова ваша интерпретация ошибки PLS-0222? –

+2

Вы пытаетесь использовать запись в виде массива здесь 'rec_depts_info_1 (v_counter_2) .v_dept_id'. Параметры: используйте правильный массив 't_depts_info_1 (v_counter_2) .v_dept_id' или запишите' rec_depts_info_1.v_dept_id' –

+0

Спасибо, но теперь я получил ошибку «NO DATA FOUND». – Rattlesnake

ответ

3

Вместо вашего явного цикла, вы можете использовать the FORALL bulk syntax вставить все значения массива сразу:

FORALL i IN t_depts_info_1.first..t_depts_info_1.last 
    INSERT INTO tabla_pruebas 
    VALUES(t_depts_info_1(i).v_dept_id, 
      t_depts_info_1(i).v_dept_name); 

Read more о FORALL и других массовых запросов и обязательные темы. Использование BULK COLLECT, а также для заполнения вашего массива, вы можете упростить ваш код:

DECLARE 
    TYPE rec_depts_info IS RECORD(
     v_dept_id departments.department_id%TYPE, 
     v_dept_name departments.department_name%TYPE); 
    TYPE typ_depts_info IS TABLE OF rec_depts_info 
     INDEX BY PLS_INTEGER; 

    t_depts_info_1 typ_depts_info; 
BEGIN 
    SELECT department_id, department_name 
    BULK COLLECT INTO t_depts_info_1 
    FROM departments 
    WHERE department_id IS NOT NULL 
    AND department_name IS NOT NULL; 

    FORALL i IN t_depts_info_1.first..t_depts_info_1.last 
    INSERT INTO tabla_pruebas 
    VALUES(t_depts_info_1(i).v_dept_id, 
      t_depts_info_1(i).v_dept_name); 
END; 
/

Хотя этот надуманным примером вам не нужен сбор или любой PL/SQL на всех, вы можете сделать простой insert...select:

INSERT INTO tabla_pruebas (column_1, column_2) 
SELECT department_id, department_name 
FROM departments 
WHERE department_id IS NOT NULL 
AND department_name IS NOT NULL; 
+0

Я понял! Большое спасибо за вашу помощь. Мне нужно практиковать больше PLSQL !!! Это очень полезно. Еще раз спасибо!!! – Rattlesnake