只是想不通为什么它给了我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 :(得分:26)
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异常。 Find out more
答案 1 :(得分:1)
变量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,则会引发错误。
答案 2 :(得分:0)
我也有同样的错误。就我而言,原因是我在表上创建了一个更新触发器,并在该触发器下再次更新了同一表。当我从触发器中删除了更新语句后,我的问题就解决了。