2016-11-13 8 views
0

Я пытаюсь сделать переменную типа пользовательской записи, установить для нее значения, а затем вставить ее в таблицу. У меня возникают трудности, и я не знаю, где я ошибаюсь. Я проверил столбцы в таблице, и они представляют собой все недопустимые числа в регистре. Но я получаю ошибку «недостаточно значений». Я работаю в SQL Developer. Вот мой код:Недостаточно значений вставить с типом регистра Oracle SQL Developer

set serveroutput on; 

DECLARE 
    TYPE ang_record IS RECORD 
    (cod employees.employee_id%TYPE, 
    nume employees.last_name%TYPE, 
    email employees.email%TYPE, 
    h_date employees.hire_date%TYPE, 
    job_id employees.job_id%TYPE, 
    sal employees.salary%TYPE, 
    dept employees.department_id%TYPE); 
    v_ang ang_record; 
BEGIN 
    v_ang.cod := 500; 
    v_ang.nume := 'Profeanu'; 
    v_ang.email := '[email protected]'; 
    v_ang.h_date := SYSDATE; 
    v_ang.job_id := 'SH_CLERK'; 
    v_ang.sal := 2000; 
    v_ang.dept := 50; 
    INSERT INTO empil (employee_id, last_name, email, hire_date, job_id, salary, department_id) 
    VALUES v_ang; 
END; 
/
ROLLBACK; 
+0

Почему используемые таблицы (сотрудники и empil) отличаются? – wieseman

+0

сотрудники - это таблица, в которой мы делаем запросы, empil - это таблица, которую мы можем изменить (они одного типа) –

+0

Зачем вам это делать? Если вы измените сотрудников empil и запросов, данные будут устаревшими. – wieseman

ответ

2

Вы сделали запись типа таблицы сотрудников. И вы хотите использовать этот тип для вставки записи в таблицу empil. Вы перепутали два способа достижения этого. Первое:

set serveroutput on; 

     DECLARE 
      TYPE ang_record IS RECORD 
      (cod employees.employee_id%TYPE, 
      nume employees.last_name%TYPE, 
      email employees.email%TYPE, 
      h_date employees.hire_date%TYPE, 
      job_id employees.job_id%TYPE, 
      sal employees.salary%TYPE, 
      dept employees.department_id%TYPE); 
      v_ang ang_record; 
     BEGIN 
      v_ang.cod := 500; 
      v_ang.nume := 'Profeanu'; 
      v_ang.email := '[email protected]'; 
      v_ang.h_date := SYSDATE; 
      v_ang.job_id := 'SH_CLERK'; 
      v_ang.sal := 2000; 
      v_ang.dept := 50; 
      INSERT INTO empil (employee_id, last_name, email, hire_date, job_id, salary, department_id) 
      VALUES (v_ang.code, v_ang.nume, v_ang.email, v_ang.h_date, v_ang.job_id, v_ang.sal, v_ang.dept); 
     END; 
     /
     ROLLBACK; 

Второе:

set serveroutput on; 

     DECLARE 
      v_ang r_empil%rowtype; 
     BEGIN 
      v_ang.employee_id := 500; 
      v_ang.last_name := 'Profeanu'; 
      v_ang.email := '[email protected]'; 
      v_ang.hire_date := SYSDATE; 
      v_ang.job_id := 'SH_CLERK'; 
      v_ang.salary := 2000; 
      v_ang.department_id := 50; 
      INSERT INTO empil (employee_id, last_name, email, hire_date, job_id, salary, department_id) 
      VALUES v_ang; 
     END; 
     /
     ROLLBACK; 

Я надеюсь, что я сделал это ясно для вас.

Удачи вам в учебе !!!

1

Я считаю, что проблема заключается в том, что SQL обрабатывает объект типа данных по отдельности, чем это делает член типа данных. v_ang считается единственным элементом, хотя он состоит из нескольких подэлементов.

Вам либо нужно создать стол, столбец которого имеет тип ang_record, либо вставить элементы отдельно.

INSERT INTO empil (employee_id, last_name, email, hire_date, 
        job_id, salary, department_id) 
VALUES (v_ang.employee_id, v_ang.last_name, v_ang.email, 
     v_ang.hire_date, v_ang.job_id, v_ang.salary, 
     v_ang.department_id);