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
被进一步定义为主键。