如何把oracle存储过程保存到数据库里?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把oracle存储过程保存到数据库里?相关的知识,希望对你有一定的参考价值。

参考技术A sqlplus 中直接敲入存储过程代码(create or replace procedure ...), / 结束,\\x0d\\x0a如果代码没有错误,该过程就被保存到数据库中。 \\x0d\\x0a可以用 exec 过程名 运行。\\x0d\\x0a\\x0d\\x0a如果是plsql developer之类的工具,那更简单,编辑完存储过程后,有运行按钮,点击即可。

如何在 oracle 存储过程中将包含 lat/lng 的数组保存到 sdo_geometry 对象

【中文标题】如何在 oracle 存储过程中将包含 lat/lng 的数组保存到 sdo_geometry 对象【英文标题】:how to save array which contains lat/lng to sdo_geometry object in oracle stored procedure 【发布时间】:2021-04-08 06:01:51 【问题描述】:

我在包内创建存储过程。我想在 sdo_geometry 对象中存储一个由 lat/lng 组成的点数组。

首先在包内声明类型

TYPE p_int_type IS TABLE OF number;

然后定义过程定义。

  PROCEDURE PRC_POLYGON_ADD_TESTING(
  pPointArray IN p_int_type,
  pCODE OUT VARCHAR2,
  pDesc OUT VARCHAR2,
  pMSG OUT VARCHAR2 );

这是我的程序主体

 PROCEDURE PRC_POLYGON_ADD_TESTING
    (
      pPointArray IN p_int_type,
      pCODE OUT VARCHAR2,
      pDesc OUT VARCHAR2,
      pMSG OUT VARCHAR2
    )
  AS
  BEGIN
      INSERT
    INTO CIRCLE_LOCATION
      (
        polygon
      )
      VALUES
      (
        sdo_geometry ( 2003      -- 2D Polygon
        , 4326                   -- WGS84, the typical GPS coordinate system
        , NULL                   -- sdo_point_type, should be NULL if sdo_ordinate_array specified
        , sdo_elem_info_array( 1 -- First ordinate position within ordinate array
        , 1003                   -- Exterior polygon
        , 1                      -- All polygon points are specified in the ordinate array
        ) , sdo_ordinate_array(pPointArray))
      );
  END PRC_POLYGON_ADD_TESTING;

但我收到错误,这里不允许使用本地集合类型。 请指导我如何在 sdo_geometry 对象中保存由点 lat/lng 组成的完整数组。点是动态的,这就是我想使用数组的原因。

【问题讨论】:

【参考方案1】:

SDO_ORDINATE_ARRAYP_INT_TYPE 不是同一种数据类型,您需要将值从一种类型转换为另一种类型。

创建包:

CREATE PACKAGE package_name IS
  TYPE p_int_type IS TABLE OF number;

  PROCEDURE PRC_POLYGON_ADD_TESTING(
    pPointArray IN p_int_type,
    pCODE OUT VARCHAR2,
    pDesc OUT VARCHAR2,
    pMSG OUT VARCHAR2
  );
END;
/

然后是body,你需要将p_int_type转换成SDO_ORDINATE_ARRAY

CREATE PACKAGE BODY package_name IS
  PROCEDURE PRC_POLYGON_ADD_TESTING(
    pPointArray IN p_int_type,
    pCODE OUT VARCHAR2,
    pDesc OUT VARCHAR2,
    pMSG OUT VARCHAR2
  )
  AS
    coords SDO_ORDINATE_ARRAY := SDO_ORDINATE_ARRAY();
  BEGIN
    coords.EXTEND( pPointArray.COUNT );
    FOR i IN 1 .. pPointArray.COUNT LOOP
      coords(i) := pPointArray(i);
    END LOOP;

    INSERT INTO CIRCLE_LOCATION
    (
      polygon
    ) VALUES (
      sdo_geometry(
          2003                   -- 2D Polygon
        , 4326                   -- WGS84, the typical GPS coordinate system
        , NULL                   -- sdo_point_type, should be NULL if sdo_ordinate_array specified
        , sdo_elem_info_array(
            1                    -- First ordinate position within ordinate array
          , 1003                 -- Exterior polygon
          , 1                    -- All polygon points are specified in the ordinate array
        )
      , coords
      )
    );
  END PRC_POLYGON_ADD_TESTING;
END;
/

然后你可以调用包来插入值:

DECLARE
  pCODE VARCHAR2(20);
  pDesc VARCHAR2(20);
  pMsg  VARCHAR2(20);
BEGIN
  PACKAGE_NAME.PRC_POLYGON_ADD_TESTING(
    PACKAGE_NAME.P_INT_TYPE( 0,0,0,10,10,10,10,0,0,0 ),
    pCode,
    pDesc,
    pMsg
  );
END;
/

db小提琴here


但是,您最好将过程声明为采用SDO_ORDINATE_ARRAY,而不是声明您自己的集合数据类型,然后您就不需要在类型之间进行转换。

【讨论】:

以上是关于如何把oracle存储过程保存到数据库里?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 存储过程 into 没找到数据 解决办法

Map型数值在oracle数据库里如何存储

oracle存储过程里调用存储过程

oracle存储过程中临时表的使用,该怎么处理

如何导出ORACLE指定存储过程

oracle存储过程提示编译完成但存在错误,如何查看错误