Ошибка Oracle ORA-06512
Просто не могу понять, почему это дает мне ошибку ORA-06512
PROCEDURE PX(pNum INT,pIdM INT,pCv VARCHAR2,pSup FLOAT)
AS
vSOME_EX EXCEPTION;
BEGIN
IF ((pNum < 12) OR (pNum > 14)) THEN
RAISE vSOME_EX;
ELSE
EXECUTE IMMEDIATE 'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('||pCv||', '||pSup||', '||pIdM||')';
END IF;
END PX;
Структура основания для стола, где сделана вставка:
CREATE TABLE "DB"."M12GR" (
"IDM12GR" NUMBER(10,0) NOT NULL ENABLE,
"CV" VARCHAR(5) NOT NULL ENABLE,
"SUP" FLOAT(126) NOT NULL ENABLE,
"IDM12" NUMBER(10,0) NOT NULL ENABLE,
CONSTRAINT "PRIMARY_30" PRIMARY KEY ("IDM12GR"),
CONSTRAINT "M12SUELORM12" FOREIGN KEY ("IDM12") REFERENCES "DB"."M12" ("IDM12") ENABLE
)
2 ответа
ORA-06512 является частью стека ошибок. Он дает нам номер строки, где произошло исключение, но не является причиной исключения. Это обычно указывается в остальной части стека (который вы еще не опубликовали).
В комментарии вы сказали
"Тем не менее, ошибка возникает, когда pNum не между 12 и 14; когда pNum между 12 и 14, это не дает сбоя"
Ну, ваш код делает это:
IF ((pNum < 12) OR (pNum > 14)) THEN
RAISE vSOME_EX;
То есть возникает исключение, когда pNum не находится между 12 и 14. Итак, остальная часть стека ошибок включает эту строку?
ORA-06510: PL/SQL: unhandled user-defined exception
Если это так, все, что вам нужно сделать, это добавить блок исключения для обработки ошибки. Может быть:
PROCEDURE PX(pNum INT,pIdM INT,pCv VARCHAR2,pSup FLOAT)
AS
vSOME_EX EXCEPTION;
BEGIN
IF ((pNum < 12) OR (pNum > 14)) THEN
RAISE vSOME_EX;
ELSE
EXECUTE IMMEDIATE 'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('||pCv||', '||pSup||', '||pIdM||')';
END IF;
exception
when vsome_ex then
raise_application_error(-20000
, 'This is not a valid table: M'||pNum||'GR');
END PX;
Документация подробно рассматривает обработку исключений PL/SQL. Узнайте больше
Переменная pCv имеет тип VARCHAR2, поэтому, когда вы объединяете вставку, вы не помещаете ее в одинарные кавычки:
EXECUTE IMMEDIATE 'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('''||pCv||''', '||pSup||', '||pIdM||')';
Кроме того, ошибка ORA-06512 возникает, когда вы пытаетесь вставить слишком большое значение в столбец. Проверьте определение таблицы M_pNum_GR и параметров, которые вы отправляете. Просто для пояснения, если вы попытаетесь вставить значение 100 в поле NUMERIC(2), ошибка возникнет.
У меня тоже была такая же ошибка. В моем случае причина заключалась в том, что я создал триггер обновления для таблицы, и под этим триггером я снова обновляю ту же таблицу. И когда я удалил инструкцию обновления из триггера, моя проблема была решена.