ОШИБКА ORACLE ORA-06512
-
26-10-2019 - |
Вопрос
Просто не могу понять, почему это дает мне ошибку 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
)
Решение
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 в числовое (2) поле, ошибка поднимет.