当前位置: 首页 > 知识库问答 >
问题:

如何在oracle spatial中为create table编写多个select语句?

须鸿祯
2023-03-14

我正在尝试基于另一个具有lon的表创建geom表。我试图在表中创建两列,一列使用Spherical Mercator(SRID 4326,地理坐标系),另一列使用投影坐标系(SRID 3857)。以下是我的查询。

create table KP_SPTL(
                            select mdsys.sdo_geometry(
                                                        2003, 
                                                        4326, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_GCS,
                              select mdsys.sdo_geometry(
                                                        2003, 
                                                        3857, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_PCS,
                                                      B.COMPANY, B.ADDRS,B_CDE
                              FROM KP_STAGE B);

我收到以下错误

Error report:
SQL Error: ORA-00936: missing expression
00936. 00000 -  "missing expression"

但是,如果我删除第二个select语句,它工作正常,我的意思是如果sql查询如下所示

create table KP_SPTL(
                            select mdsys.sdo_geometry(
                                                        2003, 
                                                        4326, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_GCS,
                                                      B.COMPANY, B.ADDRS,B_CDE
                              FROM KP_STAGE B);

如何使用第二个选择语句,如果它正常查询,我们可以使用从语句中选择。但是在这种情况下如何使用?

共有2个答案

刘子实
2023-03-14

我不知道什么是甲骨文空间在所有。但是只要看SQL,我想,下面的工作。!

mdsys.sdo_geometry() 返回 TYPE sdo_geometry,它可以在 SELECT 子句中多次使用。我们不需要每次都陪伴SELECT。

它就像SELECT B.COMPANY,B.ADDRS,B_CDE.。您不需要始终在 SELECT 前面加上前缀!

SQL 的一般语法可以是 SELECT

create table KP_SPTL(
                            select mdsys.sdo_geometry(
                                                        2003, 
                                                        4326, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_GCS,
                              mdsys.sdo_geometry(
                                                        2003, 
                                                        3857, 
                                                        NULL, 
                                                        SDO_ELEM_INFO_ARRAY(1,3,3), 
                                                        SDO_ORDINATE_ARRAY(B.LL_LAT, B.LL_LON, B.UR_LAT, B.UR_LON)
                                                      ) as KP_PCS,
                                                      B.COMPANY, B.ADDRS,B_CDE
                              FROM KP_STAGE B);

慕河
2023-03-14

由于多种原因,您的陈述不会达到您的预期。

据我所知,您的源表KP_STAGEB包含四列:LL_LAT、LL_LON、UR_LAT、UR_LON,大概是某个矩形的两个角(左下和右上)的纬度和经度。据你所说,这些坐标在long/lat WGS84(即SRID 4326)中

并且您需要一个包含两个几何对象的新表,一个包含长/纬度矩形(SRID 4326),以及SRID 3857(Google和其他人使用的球形墨卡托投影)中的等效项。

你的语法有三个问题:

1)纵坐标的顺序始终是X,然后是Y,对于地理坐标(纬度/经度),这意味着它们必须首先在经度中指定,然后以纬度指定。这是所有 GIS 系统存储地理数据的方式。所以使用这个:

sdo_geometry(
  2003, 4326, NULL, 
  SDO_ELEM_INFO_ARRAY(1,1003,3),                                                          
  SDO_ORDINATE_ARRAY(
    LL_LON, LL_LAT, 
    UR_LON, UR_LAT
  ) 
) as KP_GCS,

2) 多边形的元素类型必须是 1003 或 2003 之一,而不仅仅是 3。这样,数据库就可以区分“外环”(=正多边形)和“内环”(=孔)。

3) 最重要的是:仅通过在空间对象中设置不同的SRID,无法在不同的坐标系(在本例中为3857)中构造几何体。您需要使用SDO_CS将其转换(投影)到适当的坐标系。TRANSFORM()调用,如下所示:

sdo_cs.transform (
  sdo_geometry(
    2003, 4326, NULL, 
    SDO_ELEM_INFO_ARRAY(1,1003,3),                                                          
    SDO_ORDINATE_ARRAY(
      LL_LON, LL_LAT, 
      UR_LON, UR_LAT
    ) 
  ),
  3857
) as KP_PCS

请注意,这不会返回简单双角表示法中的矩形:虽然结果将以图形方式呈现为矩形,但其内部表示法是完整多边形的表示法。

因此,完整而正确的答案将是:

create table KP_SPTL as
select  sdo_geometry (
          2003, 4326, NULL, 
          SDO_ELEM_INFO_ARRAY (1,1003,3),                                                          
          SDO_ORDINATE_ARRAY (
            LL_LON, LL_LAT, 
            UR_LON, UR_LAT
          ) 
        ) as KP_GCS,
        sdo_cs.transform (
          sdo_geometry(
            2003, 4326, NULL, 
            SDO_ELEM_INFO_ARRAY(1,1003,3),                                                          
            SDO_ORDINATE_ARRAY(
              LL_LON, LL_LAT, 
              UR_LON, UR_LAT
            ) 
          ),
          3857
        ) as KP_PCS,
        COMPANY, ADDRS, B_CDE
from KB_STAGE_B;

或者更简单:

create table KP_SPTL as
with t as (
  select  COMPANY, ADDRS, B_CDE,
          sdo_geometry (
            2003, 4326, NULL, 
            SDO_ELEM_INFO_ARRAY (1,1003,3),                                                          
            SDO_ORDINATE_ARRAY (
              LL_LON, LL_LAT, 
              UR_LON, UR_LAT
            ) 
          ) as KP_GCS,
  from KB_STAGE_B
)
select KP_GCS, sdo_cs.transform(KP_GCS, 3857) KP_PCS, COMPANY, ADDRS, B_CDE
from t;
 类似资料:
  • 问题内容: 我正在使用MySQL,并且想在SQL中执行一种三元语句,例如: 结果将类似于: 如何做到这一点? 问题答案:

  • 问题内容: 在python中,我们使用反斜杠表示当前语句继续到下一行 例如, 或者简单地说, 可以用Go语言做到这一点吗?谢谢 问题答案: 当然可以,只需将运算符放在最后,例如: 另请注意,不可能在操作员之前中断换行。以下代码 无效 : 该规则在此处和规范中进行了描述。

  • 问题内容: 我在Robot Framework中编写条件时遇到麻烦。 我要执行 我可以在一个条件下使用此关键字,但是在多个条件下,出现此错误: 失败:关键字名称不能为空。 我也想使用这些关键字: 和 但是我最终会遇到错误。 问题答案: 您应该使用小写字母“ or”和“ and”,而不是OR和AND。 并且要注意关键字和参数之间的空格/制表符(您至少需要两个空格)。 这是一个代码示例,您的三个关键字

  • 数据库:Sybase Advantage 11 在我对数据进行规范化的过程中,我试图删除从以下语句中得到的结果:

  • 我有两个问题。 ①当useState初始值真假时,if语句如何适应下面? 比如说。。 ②当if语句为true和false时,如何使setGoodBotton从React钩子和if语句适应下面? 例如…(这不是工作)

  • 问题内容: 我在Elasticsearch索引中的文档中存储了值。 我需要对值进行一些日期操作,并返回要在过滤器中使用的布尔值。 该脚本涵盖了几行,但我无法运行它。 我编写了其他可以正常工作的脚本,但是我对Groovy的了解甚少,而对Elastic search的了解却很少。 我可以用脚本找到的每个样本只有一行,只有一行。 所以基本上我将如何采用这个完全有效的脚本 并把它变成像 我对创建一个只写一