使用函数ST_Contains错误SQLCODE = -789,SQLSTATE = 429BB

时间:2017-08-31 17:34:03

标签: database db2 spatial db2-luw

我收到了错误

  

在游标值构造函数的例程,复合SQL语句或参数列表中不支持参数或SQL变量“SHAPE”的数据类型.SQLCODE = -789,SQLSTATE = 429BB,DRIVER = 4.18.60 < / p>

当我使用代码时

 CREATE OR REPLACE TRIGGER z
BEFORE INSERT OR UPDATE ON x 
REFERENCING NEW AS N
FOR EACH ROW
BEGIN
DECLARE contador INTEGER;

    SET contador = (SELECT COUNT(*) FROM y s
    WHERE NOT(n.yID = s.yID AND db2gse.ST_Contains(s.shape, n.shape) = 1));
    IF contador > 0 THEN
        SIGNAL SQLSTATE '20001' SET MESSAGE_TEXT ='invalid relationship';
    END IF;                              
END@

但是如果拿出函数ST_Contains,它可以工作,我不知道为什么会这样。

编辑:带有DB2 11.1服务器版的Windows 7 64位Ultimate和ibm data studio,对不起,我忘了这个细节。

1 个答案:

答案 0 :(得分:0)

好吧,错误消息确实给你一个线索:在复合SQL语句中不支持结构化类型(ST_Geometry及其子节点),例如触发器主体。在将数据从交换格式转换为几何图形或将交换格式与几何图形一起存储在表格中之前,您需要执行此检查。

在后一种情况下,您将与shape ST_Geometry列一起使用另一个,例如shape_wkt varchar(5000)并在触发器中即时进行类型转换:

...AND db2gse.ST_Contains(
    db2gse.ST_Geometry(s.shape_wkt), 
    db2gse.ST_Geometry(n.shape_wkt)
)

db2gse.ST_Geometry(s.shape_wkt)可能是可选的,因为该值不需要在触发器中实例化,因此这可能有效:

...AND db2gse.ST_Contains(
    s.shape, 
    db2gse.ST_Geometry(n.shape_wkt)
)