首页 > 解决方案 > SAP HANA 过程动态 SQL 选择变量:不工作

问题描述

关于如何在过程或计算视图中使用空间函数的任何想法?我不能使用表函数,因为我需要一个游标。请参阅以下问题:

我在存储过程中尝试了动态 SQL 选择进入(不允许进入):(大约三个月前它确实有效,但现在无法激活?)这个博客说它应该可以工作: https ://blogs.sap.com /2017/04/18/sap-hana-2.0-sps-01-new-developer-features-database-development/

动态 SQL:

EXECUTE IMMEDIATE 'SELECT NEW ST_Point(' || char(39) || 'POINT(' || decEndPointLong1 || ' ' || decEndPointLat1 || ')' || char(39) || ', 4326).ST_Distance( NEW ST_Point(' || char(39) || 'POINT(' || CURRLONG || ' ' || CURRLAT || ')' || char(39) || ', 4326)) FROM DUMMY' INTO dDistEP1;

然后,我想我会创建一个计算视图,这个博客说它应该可以工作: https ://blogs.sap.com/2018/02/23/compute-distance-using-a-calculation-view-xs-advanced -模型/

但是,不允许在以太列引擎或 SQL 引擎中使用空间函数。

计算列:

STPOINT 计算视图

我回去尝试重新激活包含此代码并且一直在工作并且仍然有效的过程,但是如果我对其进行编辑并尝试激活它,则会出现相同的编译错误。无法选择变量。因此,自从我第一次创建此程序以来,情况发生了变化。

标签: sqldynamicgeospatialhana

解决方案


哇,我偶然发现了一种不需要单引号的替代语法: https

SELECT NEW ST_Point(-117.0400842, 32.92197086).ST_SRID(4326).ST_Distance( NEW ST_Point(-117.0394467, 32.92241185).ST_SRID(4326)) FROM DUMMY

现在,我认为我可以消除动态 SQL。

看两种不同的方式:

1) SELECT NEW ST_Point(-117.0400842, 32.92197086).ST_SRID(4326).ST_Distance( NEW ST_Point(-117.0394467, 32.92241185).ST_SRID(4326)) FROM DUMMY;
2) SELECT NEW ST_Point('POINT(-117.0400842 32.92197086)', 4326).ST_Distance( NEW ST_Point('POINT(-117.0394467 32.92241185)', 4326)) FROM DUMMY;

它们产生的结果略有不同(米):

  1. 77.06
  2. 77.12

可能是因为 (1) 将计算的点转换为 4326,并且 (2) 根据 4326 计算点。

所以,这段代码:

EXECUTE IMMEDIATE 'SELECT NEW ST_Point(' || char(39) || 'POINT(' || decEndPointLong1 || ' ' || decEndPointLat1 || ')' || char(39) || ', 4326).ST_Distance( NEW ST_Point(' || char(39) || 'POINT(' || CURRLONG || ' ' || CURRLAT || ')' || char(39) || ', 4326)) FROM DUMMY' INTO dDistEP1;

归结为:

SELECT r1.FROMLAT  INTO decEndPointLat1  FROM DUMMY;
SELECT r1.FROMLONG INTO decEndPointLong1 FROM DUMMY;
SELECT NEW ST_Point(decEndPointLong1, decEndPointLat1).ST_SRID(4326) INTO stEndCoord1 FROM DUMMY;
    
SELECT NEW ST_Point(CURRLONG, CURRLAT).ST_SRID(4326) INTO stCurrCoord FROM DUMMY;
    
SELECT stEndCoord1.ST_Distance(stCurrCoord) INTO dDistEP1 FROM DUMMY;

推荐阅读