Oracle PL/SQL函数未使用变量为何仍需INTO子句?能否简化?
问题解答
为什么必须保留INTO子句?
在Oracle PL/SQL的函数、存储过程这类过程化代码块里,执行单条返回单行结果的SELECT语句时,语法强制要求用INTO子句把查询结果存到变量里。说白了,PL/SQL是过程化编程语言,和直接写SQL返回结果集不一样,它要求你明确给查询出来的单行数据找个“容身之处”——也就是变量,哪怕你之后根本用不上这个变量,只要写了这种单条SELECT,就必须用INTO把结果存进去,不然Oracle不知道该拿这个结果怎么办,直接给你报ORA-06553: PLS-428错误。
简化函数的方法
看你的需求,应该是想通过调用sde.st_intersects来检测空间几何对象有没有问题(比如格式错了、数据无效这类情况,会触发函数执行报错),完全没必要存函数的返回值。那可以直接去掉多余的SELECT INTO结构,直接在PL/SQL里调用函数就行:
简化后的示例代码
CREATE OR REPLACE FUNCTION check_invalid_geom(p_geom SDE.ST_GEOMETRY) RETURN VARCHAR2 IS BEGIN -- 直接调用空间函数,只要能正常执行就说明几何没问题 sde.st_intersects(p_geom, sde.st_point(0, 0)); RETURN 'GEOMETRY_VALID'; EXCEPTION WHEN OTHERS THEN RETURN 'GEOMETRY_INVALID'; END; /
简化逻辑说明
- 不用再用
SELECT包裹函数调用,自然就避开了必须写INTO的要求。 - 执行过程中,如果空间对象有问题,会触发异常,直接跳到
EXCEPTION块返回错误标识;如果函数能正常跑完,就返回有效标识。
要是你还需要判断sde.st_intersects的返回值(比如判断几何是否和指定点相交),也可以直接在逻辑里用,不用存到变量:
CREATE OR REPLACE FUNCTION check_geom_intersect(p_geom SDE.ST_GEOMETRY) RETURN VARCHAR2 IS BEGIN IF sde.st_intersects(p_geom, sde.st_point(0, 0)) = 1 THEN RETURN 'INTERSECTS'; ELSE RETURN 'NO_INTERSECT'; END IF; EXCEPTION WHEN OTHERS THEN RETURN 'GEOMETRY_INVALID'; END; /
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

