2011-10-19 995 views
1

只是想不通爲什麼它給了我ORA-06512錯誤Oracle錯誤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 
) 
+0

什麼是完整的錯誤堆棧? ORA-06512只是行號(這將有助於包括),實際的錯誤是在錯誤堆棧。 –

+0

ORA-06512:ON「DB.PX」,第11行 ORA-06512:ON LINE 12 –

+0

您可以而且應該*編輯你的問題*包括代替張貼註釋,在這裏很容易錯過更多的信息和很難閱讀。 – APC

回答

20

ORA-06512是錯誤堆棧的一部分。它給我們發生異常的行號,但不是異常的原因。這通常表示在堆棧的其餘部分(您還沒有發佈)。

在評論你說

「儘管如此,錯誤出現時PNUM不是12和14之間;當PNUM 是12和14之間不失敗」

好,你的代碼做這個:

IF ((pNum < 12) OR (pNum > 14)) THEN  
    RAISE vSOME_EX; 

也就是說,它會拋出異常PNUM是不是和14之間的12也是如此錯誤堆棧的其餘部分包括:這條線?

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異常。 Find out more

1

變量PCV是VARCHAR2類型的,所以當你Concat的你是不是把它單引號內插入:

EXECUTE IMMEDIATE 'INSERT INTO M'||pNum||'GR (CV, SUP, IDM'||pNum||') VALUES('''||pCv||''', '||pSup||', '||pIdM||')'; 

此外,該錯誤ORA當您嘗試在列中插入太大的值時引發-06512。檢查表M_pNum_GR的定義和您發送的參數。只是爲了澄清,如果您嘗試在數值(2)字段中插入值100,則會引發錯誤。

+0

不能這樣做,因爲它成對出現; VALUES(「」「|| PCV ||」「」,'是,當PNUM不是12和14之間的錯誤出現;當PNUM是12和14之間不會失敗 –

+1

那麼您可以附加一個的DDL您M_pNum_GR表?你確定所有的結構都是相同的嗎? –

+0

'CREATE TABLE「DB」。「M12GR」 \t(「IDM12GR」NUMBER(10,0)NOT NULL ENABLE,「CV」VARCHAR(5)NOT NULL使用索引PCTFREE 10 INITRANS 2 MAXTRANS 255計算統計信息STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)TABLESPACE「DB」ENABLE, \t \t的約束 「M12SUELORM12」 外鍵( 「IDM12」)參考 「DB」。「M12」(「IDM12」)ENABLE)' –