11

只是无法弄清楚为什么它给了我 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
)
4

3 回答 3

37

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 异常。

于 2011-10-19T03:44:57.787 回答
2

变量 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,则会引发错误。

于 2011-10-19T01:50:40.507 回答
0

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

于 2019-11-15T13:07:25.247 回答