Как перебрать входные переменные с использованием PL / SQL - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь выполнить итерацию функции вставки таблицы сотрудников. Когда я пытаюсь выполнить код, он не запрашивает ввод более одного раза.

вот мой код

DECLARE
  l_counter NUMBER := 0;

  return_message VARCHAR2(100);
  is_exit int;
  --want_to_continue number;
  emp_name VARCHAR2(70);--:='&f_name'; 
  sur_name VARCHAR2(70);--:='&l_name';
  dob VARCHAR2(70);--:='&birth_date'; 
  personalid INT;--:=&per_id;

BEGIN
  WHILE l_counter > -1
  LOOP 
    emp_name :='&f_name'; 
    sur_name :='&l_name';
    dob :='&birth_date';
    personalid :='&per_id';       
    return_message := fn_Insert_Employees(emp_name, sur_name, to_date(dob, 'YYYY-MM-DD'), personalid);
    COMMIT; 
    l_counter := l_counter + 1;
  END LOOP;
END;

Ошибка нарушения первичного ключа возникает при выполнении указанного выше блока кода. Подробное сообщение об ошибке приведено ниже

Отчет об ошибке - ORA-00001: уникальное ограничение (SYS.SYS_C007404) нарушено ORA-06512: в «SYS.FN_INSERT_EMPLOYEES», строка 12 ORA-06512: в строке 21 00001. 00000 - «уникальное ограничение (% s.% S) нарушено» * Причина: оператор UPDATE или INSERT попытался вставить дубликат ключа. Для Trusted Oracle, настроенного в режиме СУБД MA C, вы можете увидеть это сообщение, если дублирующаяся запись существует на другом уровне. * Действие: либо удалите уникальное ограничение, либо не вставляйте ключ.

Я полагаю, что приведенный выше код просто повторно использует входные значения в следующей итерации.

Пожалуйста, помогите мне получить входные переменные итерации.

1 Ответ

1 голос
/ 30 апреля 2020

Это указывало на серьезное отсутствие понимания пары вопросов.

  1. Поскольку @ AP C pl sql (а также sql) не являются интерактивными. Если пойти немного дальше, это приведет к тому, что они оба не смогут запросить ввод . Вы должны понимать переменные подстанции. У вас никогда нет прямого доступа к базе данных, между вами и базой данных всегда есть слой программного обеспечения (ваша IDE, sqlplus, sqlcl, язык разработки и т. Д. c). Именно этот слой замечает переменную подстановки (& ...) и запрашивает ее значение. В этот момент он физически изменяет эту строку кода, подставляя (таким образом, имя) введенное значение перед отправкой в ​​базу данных. База данных никогда не видит фактический код с переменной подстановки.
  2. «Я действительно хочу работать это oop неограниченное количество раз». Нет, не надо. . У этого есть только 2 способа завершения. Он сгенерирует исключение, когда он израсходует ВСЕ необходимые ресурсы, будь то память, сегменты отката, ... Если никогда не исчерпать доступный ресурс, он будет работать буквально вечно, если не будет убит администратором базы данных.
...