Вопрос:
Просто не могу понять, почему это дает мне ошибку 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.
Ответ №1
Переменная 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), ошибка будет повышаться.