Ошибка Oracle ORA-06512 - PullRequest
       25

Ошибка Oracle ORA-06512

3 голосов
/ 19 октября 2011

Просто не могу понять, почему это дает мне 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 ]

27 голосов
/ 19 октября 2011

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 голос
/ 19 октября 2011

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

...