需求是这样的:有一张经纬度表,需要从中随机取一条数据插入另一张表作为其中的两个字段。插入过程在存储过程中,所以需要函数返回值为经纬度数据对象。
首先,生成返回值对象POINT_OBJECT,包括经度纬度。
--生成经纬度
CREATE OR REPLACE TYPE POINT_OBJECT AS OBJECT
(
LONGITUDE VARCHAR2(128),
LATITUDE VARCHAR2(128)
);
函数POINT_FUNCTION的过程就是定义select... into... from table,from是随机抽取经纬度表中的一条。(没有参数的函数不要加括号,不要加括号,不要加括号)
CREATE OR REPLACE FUNCTION POINT_FUNCTION
RETURN POINT_OBJECT
AS
RADOM_POINT POINT_OBJECT := POINT_OBJECT('','');
BEGIN
SELECT LONGITUDE,LATITUDE
INTO RADOM_POINT.LONGITUDE,RADOM_POINT.LATITUDE
FROM (select LONGITUDE,LATITUDE from (select * from HEATMAPPOINT order by dbms_random.value) where rownum<=1) ;
RETURN RADOM_POINT;
END;
SELECT POINT_FUNCTION().LONGITUDE FROM DUAL;
使用方法:在存储过程中定义一个POINT_OBJECT类型的变量radompoint,然后赋值radompoint := POINT_FUNCTION(); 取值为:radompoint.LATITUDE;radompoint.LONGITUDE
引用过程eg:
declare maxrecords constant int:=10000;
radompoint POINT_OBJECT;
i int :=1;
begin
for i in 1..maxrecords loop
id := get_uuid;
radompoint := POINT_FUNCTION();
incident_time := get_date;
incident_disposal_id := get_uuid;
INSERT INTO INCIDENTINFORMATION
(INCIDENTINFORMATIONID,INCIDENTSTATEID,STARTTIME,ENDTIME,INCIDENTACTUALLYADDRESS,PROVINCE,CITY,LATITUDE,LONGITUDE,INCIDENTTYPEID,INCIDENTNUMBER,COMBINESTATE)
VALUES
(id,7,incident_time,null,'113','0201','020101',radompoint.LATITUDE,radompoint.LONGITUDE,'0120712',DBMS_RANDOM.STRING ('A', 11),0);
end loop;
dbms_output.put_line(' 成功录入数据! ');
commit; end;