如何在数据库中有一个ADT类型属性的表中进行插入?使用Oracle Live SQL



我创建了一个表格,用于查看拉丁国家有多少人可能死于新冠肺炎。为此,我创建了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-您缺少了一个Ps。其次,论点-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之间更有意义。

最新更新