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

问题描述 投票:0回答:1

在 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 添加前缀?

sql oracle sql-insert user-defined-types oracle18c
1个回答
0
投票

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

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

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.