在 Oracle 18c 的 db<>fiddle 中:
我创建了一个用户定义类型 (UDT) 和一个使用该类型的表:
create or replace TYPE "MY_ST_GEOMETRY" Authid current_user AS object
(entity integer,numpts integer,minx float(64),
miny float(64),maxx float(64),maxy float(64),
minz float (64),maxz float(64),minm float(64),
maxm float(64),area float(64),len float(64),
srid integer,points blob,
constructor Function my_st_geometry(geom_str clob,srid number) Return self AS result deterministic,
constructor Function my_st_geometry(x number,
y number,
z number,
m number,
srid integer) Return self AS result deterministic) NOT final
create table polygons (
id int,
shape my_st_geometry
)
我想在表中插入一行。
insert into polygons (id, shape ) VALUES (
1,
my_st_geometry('polygon ((52 28,58 28,58 23,52 23,52 28))', 4326)
);
但是我收到错误:
ORA-04067: not executed, type body "FIDDLE_KVDCLIHQNZSONDPDJHLS.MY_ST_GEOMETRY" does not exist
ORA-06508: PL/SQL: could not find program unit being called: "FIDDLE_KVDCLIHQNZSONDPDJHLS.MY_ST_GEOMETRY"
ORA-06512: at line 1
我怀疑我需要在 UDT 前加上用户名前缀。由于 db<>fiddle 每次运行时都会生成不同的用户名,因此我相信我需要使用函数动态获取用户名。
是否有一个函数可以用来获取用户——以便我可以在插入行时为 UDT 添加前缀?
您需要将类型传递给构造函数:
create or replace TYPE "MY_ST_GEOMETRY" Authid current_user AS object(
entity integer,
numpts integer,
minx float(64),
miny float(64),
maxx float(64),
maxy float(64),
minz float(64),
maxz float(64),
minm float(64),
maxm float(64),
area float(64),
len float(64),
srid integer,
points blob,
constructor Function my_st_geometry(
SELF IN OUT NOCOPY my_st_geometry,
geom_str clob,
srid number
) Return self AS result deterministic,
constructor Function my_st_geometry(
SELF IN OUT NOCOPY my_st_geometry,
x number,
y number,
z number,
m number,
srid integer
) Return self AS result deterministic
) NOT final;
然后您需要为类型创建一个主体,定义您想要如何构造该类型:
create or replace TYPE BODY "MY_ST_GEOMETRY" IS
constructor Function my_st_geometry(
SELF IN OUT NOCOPY my_st_geometry,
geom_str clob,
srid number
) Return self AS result deterministic
IS
BEGIN
-- Add constructor logic here.
RETURN;
END;
constructor Function my_st_geometry(
SELF IN OUT NOCOPY my_st_geometry,
x number,
y number,
z number,
m number,
srid integer
) Return self AS result deterministic
IS
BEGIN
-- Add constructor logic here.
SELF.minx := x;
SELF.maxx := x;
SELF.miny := y;
SELF.maxy := y;
SELF.minz := z;
SELF.maxz := z;
SELF.minm := m;
SELF.maxm := m;
SELF.srid := srid;
RETURN;
END;
END;
/
然后它就“起作用了”(注意:您需要完成构造函数并定义构造类型的逻辑)。