Sql ORA-01422返回时间戳时

Sql ORA-01422返回时间戳时,sql,oracle,Sql,Oracle,我有下表 CREATE TABLE Vehicle_Location ( id_park INTEGER CONSTRAINT nn_vehicle_location_id_park NOT NULL, id_vehicle VARCHAR(255), parkedtime TIMESTAMP NOT NULL, CONSTRAINT pk_vehicle_location_id_vehicle PRIMARY KEY (id_vehicle) ); 我试图用

我有下表

CREATE TABLE Vehicle_Location 
(
    id_park INTEGER CONSTRAINT nn_vehicle_location_id_park NOT NULL,
    id_vehicle VARCHAR(255),
    parkedtime TIMESTAMP NOT NULL,
    CONSTRAINT pk_vehicle_location_id_vehicle PRIMARY KEY (id_vehicle)
);
我试图用下面的过程返回一个时间戳

create or replace FUNCTION GETBICYCLEPARKEDTIME(id_vehicle VARCHAR)
RETURN TIMESTAMP AS
    refTime TIMESTAMP;
BEGIN
    Select "PARKEDTIME" into refTime 
    from "VEHICLE_LOCATION" 
    where "ID_VEHICLE" = id_vehicle;
    RETURN refTime;
END;
但是,我得到了一个错误:

ORA-01422:精确获取返回的行数超过请求的行数


尽管从我的理解来看,我不知道如何使用上述过程选择多行。

PL/SQL不区分大小写。所以这条线是你的问题:

其中“ID\u VEHICLE”=ID\u VEHICLE

由于标识符
“ID\u VEHICLE”
ID\u VEHICLE
是相同的。(当标识符不是全部大写时,双引号仅使标识符区分大小写。)因此WHERE子句将两者解析为范围中最接近的标识符,即列名。因此,WHERE子句相当于
WHERE 1=1
。因此,查询将返回表中的每一行

解决方案是使参数不同。这就是为什么命名参数时通常使用前缀的原因:

create or replace FUNCTION GETBICYCLEPARKEDTIME(p_id_vehicle VARCHAR)
RETURN TIMESTAMP AS
    refTime TIMESTAMP;
BEGIN
    Select "PARKEDTIME" into refTime 
    from "VEHICLE_LOCATION" 
    where "ID_VEHICLE" = p_id_vehicle;
    RETURN refTime;
END;

PL/SQL不区分大小写。所以这条线是你的问题:

其中“ID\u VEHICLE”=ID\u VEHICLE

由于标识符
“ID\u VEHICLE”
ID\u VEHICLE
是相同的。(当标识符不是全部大写时,双引号仅使标识符区分大小写。)因此WHERE子句将两者解析为范围中最接近的标识符,即列名。因此,WHERE子句相当于
WHERE 1=1
。因此,查询将返回表中的每一行

解决方案是使参数不同。这就是为什么命名参数时通常使用前缀的原因:

create or replace FUNCTION GETBICYCLEPARKEDTIME(p_id_vehicle VARCHAR)
RETURN TIMESTAMP AS
    refTime TIMESTAMP;
BEGIN
    Select "PARKEDTIME" into refTime 
    from "VEHICLE_LOCATION" 
    where "ID_VEHICLE" = p_id_vehicle;
    RETURN refTime;
END;

select
查询存在问题

它正在返回多个具有给定
条件的记录,其中
条件:

Select "PARKEDTIME" into refTime from "VEHICLE_LOCATION" where "ID_VEHICLE" = id_vehicle;
尝试限制
WHERE
子句仅返回一条记录

您可以在
WHERE
子句中使用更多条件,或者使用
DISTINCT
或者使用
groupby
聚合函数


干杯

选择查询有问题

它正在返回多个具有给定
条件的记录,其中
条件:

Select "PARKEDTIME" into refTime from "VEHICLE_LOCATION" where "ID_VEHICLE" = id_vehicle;
尝试限制
WHERE
子句仅返回一条记录

您可以在
WHERE
子句中使用更多条件,或者使用
DISTINCT
或者使用
groupby
聚合函数


干杯

如果确实希望参数与表列具有相同的名称,另一种方法是使用点表示法作为参数名称的前缀:

create or replace function getbicycleparkedtime(id_vehicle varchar2)
    return timestamp
as
    reftime timestamp;
begin
    select parkedtime into reftime 
    from   vehicle_location l
    where  l.id_vehicle = getbicycleparkedtime.id_vehicle;

    return reftime;
end;
此处,
l.id\u vehicle
明确表示表格列,
getbicycleMarkedTime.id\u vehicle
表示功能参数

但这可能会变得非常冗长,因此更常见的做法是使用与列名不同的约定来命名参数。一些常见的命名模式会给出
p\u id\u location
(p表示“参数”)、
in\u id\u location
(表示
in
参数)、
idLocation
locationId
(假设列名使用下划线)

只有非标准名称才需要双引号,否则会导致解析问题,因为它们是保留字,或以数字开头,包含标点符号等,这应该是罕见的(这可能是跨平台可移植性所必需的,或者是像SAP这样的系统,其中表可以有
SAPSMP./BIC/A011DAP
这样的名称)。在并非绝对必要的情况下使用双引号被认为是不好的做法


使用大写/小写/混合大小写是一种样式首选,但作为程序员,我建议您选择一种最适合自己的样式并坚持使用。

如果您确实希望参数与表列具有相同的名称,另一种方法是使用点表示法作为参数名称的前缀:

create or replace function getbicycleparkedtime(id_vehicle varchar2)
    return timestamp
as
    reftime timestamp;
begin
    select parkedtime into reftime 
    from   vehicle_location l
    where  l.id_vehicle = getbicycleparkedtime.id_vehicle;

    return reftime;
end;
此处,
l.id\u vehicle
明确表示表格列,
getbicycleMarkedTime.id\u vehicle
表示功能参数

但这可能会变得非常冗长,因此更常见的做法是使用与列名不同的约定来命名参数。一些常见的命名模式会给出
p\u id\u location
(p表示“参数”)、
in\u id\u location
(表示
in
参数)、
idLocation
locationId
(假设列名使用下划线)

只有非标准名称才需要双引号,否则会导致解析问题,因为它们是保留字,或以数字开头,包含标点符号等,这应该是罕见的(这可能是跨平台可移植性所必需的,或者是像SAP这样的系统,其中表可以有
SAPSMP./BIC/A011DAP
这样的名称)。在并非绝对必要的情况下使用双引号被认为是不好的做法


使用大写/小写/混合大写是一种样式首选项,但作为一名程序员,我建议你选择一种最适合自己的风格,并坚持下去。

因为在条件无用的地方,
ID\u VEHICLE
被进一步定义为主键。在条件无用的地方,
ID\u VEHICLE
被进一步定义为主键。