为什么我们需要将 MDSYS.ST_GEOMETRY 视为 ST_LINESTRING 才能使用 ST_PointN(1)?

2023-12-01

MDSYS.ST_GEOMETRY;甲骨文18c:


以下查询有效。它从 MDSYS.ST_GEOMETRY 中提取第一个点:

--Source: https://www.spdba.com.au/using-oracles-st_geometry-type-hierarchy-with-sdo_geometry-st_pointn-and-st_numpoints/

with    cte as (
select  treat(mdsys.st_geometry.from_wkt('LINESTRING(10 10, 20 20)',26917) as mdsys.st_linestring) as shape
from    dual
)
select 
    (shape).st_pointn(1) as first_point
from 
    cte

Result:
MDSYS.ST_POINT(MDSYS.SDO_GEOMETRY(2001, 26917, MDSYS.SDO_POINT_TYPE(10, 10, NULL), NULL, NULL))

我不明白为什么我们需要Treat()ST_GEOMETRY 超类型作为 ST_LINESTRING 子类型以便使用ST_PointN()明白要点。

例如,如果我删除Treat(... as ST_LINESTRING),然后我得到一个错误:

with    cte as (
select  mdsys.st_geometry.from_wkt('LINESTRING(10 10, 20 20)',26917) as shape
from    dual
)
select 
    (shape).st_pointn(1) as first_point
from 
    cte

Error:
ORA-00904: "MDSYS"."ST_GEOMETRY"."ST_POINTN": invalid identifier

为什么我删除时会出现此错误Treat()?


为什么我删除时会出现此错误Treat()?

  • ST_LINESTRING是一个子类型ST_CURVE反过来,它是一个子类型ST_GEOMETRY.
  • ST_POINTN是在子类型上声明的成员函数ST_CURVE and ST_LINESTRING继承了这个功能。
  • ST_POINTN未声明为父类型的成员函数ST_GEOMETRY.
  • The ST_GEOMETRY.FROM_WKT()函数返回一个ST_GEOMETRY实例,在这种情况下实际上是ST_LINESTRING子类型,但函数的返回类型是ST_GEOMETRY因为它可以返回任何子子类型。

当您删除时TREAT()那么你正试图打电话给ST_POINTN父类型的成员函数ST_GEOMETRY并且,正如错误消息所述"MDSYS"."ST_GEOMETRY"."ST_POINTN"是无效标识符,因为该类型没有该成员函数。

当你包括TREAT()然后将超类型转换为子类型,然后调用该子类型的成员函数,并且该成员函数确实存在,因此它可以工作。


类似的例子是:

CREATE TYPE parent_type IS OBJECT (
 x NUMBER,
 y NUMBER
) NOT FINAL;

CREATE TYPE child_type UNDER parent_type (
  MEMBER FUNCTION get_x RETURN NUMBER
);

CREATE TYPE BODY child_type IS
  MEMBER FUNCTION get_x RETURN NUMBER
  IS
  BEGIN
    RETURN self.x;
  END;
END;
/

Then:

CREATE FUNCTION create_parent RETURN PARENT_TYPE
IS
BEGIN
  RETURN child_type(1, 2);
END;
/

如果您使用:

SELECT create_parent().get_x() FROM DUAL;

然后函数声明它返回一个PARENT_TYPE因此,即使实际返回值是一个,也会在该类型上调用成员函数CHILD_TYPE,因此引发错误:

ORA-00904: "SCHEMA_NAME"."PARENT_TYPE"."GET_X": invalid identifier

如果你使用TREAT将返回的父对象转换为其实际的子类型:

SELECT TREAT(create_parent() AS child_type).get_x() FROM DUAL;

那么输出是:

TREAT(CREATE_PARENT()ASCHILD_TYPE).GET_X()
1

数据库小提琴here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们需要将 MDSYS.ST_GEOMETRY 视为 ST_LINESTRING 才能使用 ST_PointN(1)? 的相关文章

随机推荐

  • Tensorflow 2 中 tf.variable 的条件赋值

    对于 numpy 我们有 threshold 3 a np array 1 2 3 4 5 6 a a gt 3 199 a is 1 2 199 199 199 199 如何编写类似的代码tensorflow 2 b tf Variabl
  • Swift、SpriteKit:如何保存场景的整个进度

    我用 GameViewController swift 构建了一个快速游戏 import UIKit import SpriteKit class GameViewController UIViewController override f
  • XMLHttpRequest 上传进度未正确触发

    我正在尝试使用 XMLHttpRequest 发送文件 该文件正在工作 但我的进度监视器不工作 我尝试上传 700KB 文件和 3MB 文件 但遇到了同样的问题 progress 事件触发一次 并且仅触发一次 并且它表示 event loa
  • 如何使用 Google Cloud Vision API 读取一列文本

    我有下一个文档图像 当我尝试将图像转换为文本时 结果是这样的 Top Text Ref Rad Dte Ddo Ejecutivo 76520400300 Banco de Bogot Luz Adriana Bottom Text 问题是
  • Axios,向 Flask 发出 POST 请求

    我尝试使用 axios 向 Flask 服务器发送 POST var config headers Content Type application json Access Control Allow Origin axios post h
  • 静音 3D 触摸 快速操作

    由于新 iPhone 6s 6s 具有新的 3D Touch 功能 我正在尝试向我的应用程序添加一些主屏幕快速操作 我能够实现正常的力流 触摸主屏幕中的应用程序图标 gt 选择可用的快速操作之一 gt 在所有可能的应用程序状态下正确处理它
  • REPL、解释器和编译器之间的关系

    From 维基百科 REPL 通常被误称为 口译员 这是一个用词不当 很多 使用的编程语言 编译 包括字节码 编译 有 REPL 例如 Common Lisp 和 Python From 对此帖子的回复 交互式解释器使用 REPL 一个 口
  • 在 PHP 中动态访问类常量

    我希望能够动态查找常量的值 但使用变量不适用于语法 gives apple banana orange Fatal error Access to undeclared static property Food type 如何动态调用常量
  • 在 AppEngine Python 上使用 Reportlab 生成的 PDF 文档中添加图像文件的正确方法

    我正在尝试使用 App Engine Python 上的 reportlab 生成 PDF 报告 但我不知道如何正确附加图像 图像是静态的 这是我的项目的目录树 这就是我所做的 在 奇帕斯 py 获取图像 im Image static l
  • python脚本的CPU使用率

    是否可以检查简单脚本的CPU使用率 例如 如何获取打印 100 次 hello world 的 CPU 使用率 以百分比表示 目前我正在控制台中获取执行时间 方法是 time p python script py 如果你使用的是 UNIX
  • php 包含文件包含

    我正在一个网站上工作 并被要求包含位于我的 php 脚本上方的文件夹中的文件 问题是那些我被要求包含的 php 文件包含在其中 因此 在调用我的 php 页面时找不到它们引用的文件 处理这种情况的最佳方法是什么 将文件从文件夹 B 包含到文
  • 将客户端证书设置为 Java HTTP 连接中的请求属性?

    我有一个 Java 应用程序 它通过带有 SSL 的套接字连接到另一个 Java 应用程序 因此我的客户端 JVM 已经具有 Djavax net ssl keyStore and Djavax net ssl trustStore属性设置
  • 如何在延迟着色中从光照几何体的内部进行绘制

    我正在尝试使用 OpenGL 和 GLSL 实现延迟着色器 但我在处理光照几何时遇到了问题 这些是我正在采取的步骤 Bind multitarget framebuffer Render color position normal and
  • 访问 Service 中的请求范围 Bean

    我有一颗普通豆 它是 a Scope request 或 b 放置在HttpServletRequest通过过滤器 拦截器 如何在 a 中访问这个 bean Service哪一种是应用程序范围的单例 这样做的原因是 因为我有一个自定义对象R
  • 使用 Heroku 设置 Paperclip Amazon S3

    has attached file image storage gt s3 s3 credentials gt RAILS ROOT config s3 yml path gt style filename 我不知道什么 path gt s
  • 缺少 1 个必需的位置参数:'self'

    这是我的代码 class Email Stuff def init self self emailaddr None self recipaddr None self EmailUser None self EmailPass None d
  • 如何确定文本节点中被点击的字符?

    我可以设置一个事件侦听器来告诉我 HTML 文档中某个位置何时发生鼠标单击 但是 如果单击发生在某些文本上 我需要知道单击发生在文本中的哪个字符上 有没有办法做到这一点 我能想到一些非常令人讨厌的解决方案 例如 对于文档中的每个字符 我可以
  • HttpClient上传大文件并显示发送的字节数

    我找到了这个代码示例 import org apache http params CoreProtocolPNames import org apache http util EntityUtils public class PostFil
  • 从 Excel 将超过 65.535 行导入到 MS Access

    我正在运行以下代码将整个工作表从 Excel 导入到 Access 该工作表有 77k 行 但 Access 仅导入 65 535 行 关于如何修复它有任何疑问吗 Excel 和 Access 都是 2013 版本 Function imp
  • 为什么我们需要将 MDSYS.ST_GEOMETRY 视为 ST_LINESTRING 才能使用 ST_PointN(1)?

    MDSYS ST GEOMETRY 甲骨文18c 以下查询有效 它从 MDSYS ST GEOMETRY 中提取第一个点 Source https www spdba com au using oracles st geometry typ