Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top