在 db<>fiddle 会话中引用用户定义的类型(插入行时)

Reference a user-defined type in a db<>fiddle session (when inserting a row)

提问人:User1974 提问时间:10/31/2023 最后编辑:User1974 更新时间:10/31/2023 访问量:32

问:

在 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

db<>小提琴

我怀疑我需要在UDT前面加上用户名。由于每次我点击运行时 db<>fiddle 都会生成不同的用户名,因此我认为我需要使用函数动态获取用户名。

是否有可用于获取用户的函数 - 以便我可以在插入行时为 UDT 添加前缀?

Oracle SQL-INSERT 用户定义类型 ORACLE18C

评论


答:

1赞 MT0 10/31/2023 #1

您需要将类型传递到构造函数中:

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;
/

然后它“工作”(注意:您需要完成构造函数并定义构造类型的逻辑)。

小提琴