Oracle Error ORA-06512



就是不明白为什么会出现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的定义和您正在发送的参数。只是为了澄清,如果您尝试在NUMERIC(2)字段中插入值100,则会引发错误。

我也有同样的错误。在我的例子中,原因是我在一个表上创建了一个更新触发器,并且在该触发器下我再次更新同一个表。当我从触发器中删除更新语句时,我的问题就解决了。

相关内容

  • 没有找到相关文章

最新更新