我创建了一个表格,用于查看拉丁国家有多少人可能死于新冠肺炎。为此,我创建了ADT结构,该结构具有两个属性probabilidad_fallecidos
,即死亡概率和cantidad_infectados
,即每个国家的感染人数。我遇到的问题是,当我试图插入时,ORA-00947: not enough values
我对此很陌生,这是我第一次尝试
下面我将让我的ADT结构,我的功能,我的表和我的尝试插入
ADT
CREATE OR REPLACE TYPE infectados AS OBJECT(
cantidad_infectados number,
probabilidad_fallecidos number,
STATIC FUNCTION cantidad_fallecidos(cantidad_infectados number,probabilidad_fallecidos number) RETURN number
);
函数cantidad_fallecidos
CREATE OR REPLACE TYPE BODY infectados IS
STATIC FUNCTION cantidad_fallecidos(cantidad_infectados number,probabilidad_fallecidos number) RETURN number
IS numero1 number(1);
BEGIN
IF cantidad_infectados > probabilidad_fallecidos*cantidad_infectados THEN
RETURN (probabilidad_fallecidos*cantidad_infectados);
ELSE
RAISE_APLICATION_ERROR(-2000,'Error: cantidad_infectados es menor a la probabilidad de fallecidos');
END IF;
END;
END;
创建我的表
CREATE TABLE Vnzla_infectado(
vnzlaInf_id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
num_infectados infectados
);
尝试插入
INSERT INTO Vnzla_infectado
VALUES (infectados(100,0.1,infectados.cantidad_fallecidos(100,0.1)));
您得到错误ORA-00947: not enough values
,因为您提供了一个值以插入到具有两列的表中,并且您没有指定要插入的列,因此Oracle认为您正在插入所有列。
您的vnzlaInf_id
列可能是由IDENTITY
生成的,但它在数据库中看起来就像您试图在该列中插入一个值,而在num_infectados
列中没有插入任何值,因此会出现值不足的错误。
因此,您需要做的第一件事是修改INSERT
语句,告诉数据库您要插入哪个列:
INSERT INTO Vnzla_infectado (num_infectados)
VALUES ...
我写"第一件事"是因为你的INSERT
声明还有另一个问题。如果添加该列名,则会得到另一个错误ORA-02315: incorrect number of arguments for default constructor
。这是因为您的类型构造函数有两个参数,但您指定了三个。解决这个问题的一种方法是去掉第三个论点:
INSERT INTO Vnzla_infectado (num_infectados)
VALUES (infectados(100,0.1));
此INSERT
语句成功运行。
或者,您可能需要在您的类型中添加另一个字段:
CREATE OR REPLACE TYPE infectados AS OBJECT(
cantidad_infectados number,
probabilidad_fallecidos number,
your_new_field_name_here number,
STATIC FUNCTION cantidad_fallecidos(cantidad_infectados number,probabilidad_fallecidos number) RETURN number
);
如果要更改类型,则必须先删除表,然后再重新创建它。完成此操作后,原始的INSERT
语句运行良好。
当我在这里的时候,我注意到你的静态函数cantidad_fallecidos
还有一些其他问题。首先,RAISE_APLICATION_ERROR
中有一个拼写错误,应该是RAISE_APPLICATION_ERROR
-您缺少了一个P
s。其次,论点-2000
将被Oracle拒绝:如果您试图提出自定义错误,它将向ORA-21000: error number argument to raise_application_error of -2000 is out of range
投诉。我猜你的意思是用-20000
作为错误号。第三,条件
cantidad_infectados > probabilidad_fallecidos*cantidad_infectados
在我看来有点奇怪。如果cantidad_fallecidos
大于零,那么它就等于
1 > probabilidad_fallecidos
此外,您确定需要使用>
而不是>=
吗?在不寻常的情况下,这会导致一些奇怪的行为:如果cantidad_infectados
为零,则您的条件永远不会为真,并且无论probabilidad_fallecidos
是什么,都会引发您的自定义错误。对我来说,验证probabilidad_fallecidos
在0和1之间更有意义。