PL/SQL函数返回关联数组后直接索引调用的语法疑问
PL/SQL函数返回集合后直接索引的语法解析
问题场景
参考《PL/SQL用户指南与参考》的示例代码运行成功,但无法理解第18行的TO_CHAR(get_sum_multiples (m, sn)(n))语法:函数调用后直接跟索引(n)无分隔符为何可行?修改为TO_CHAR(get_sum_multiples (m, sn),(n))却报错,需解析该语法逻辑。
示例代码
DECLARE TYPE sum_multiples IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER; n PLS_INTEGER := 5; -- 要展示的倍数求和个数 sn PLS_INTEGER := 10; -- 实际计算的倍数求和个数 m PLS_INTEGER := 3; -- 目标倍数 FUNCTION get_sum_multiples(multiple IN PLS_INTEGER, num IN PLS_INTEGER) RETURN sum_multiples IS s sum_multiples; BEGIN FOR i IN 1..num LOOP s(i) := multiple * ((i * (i + 1)) / 2) ; -- 计算前i个倍数的和 END LOOP; RETURN s; END get_sum_multiples; BEGIN DBMS_OUTPUT.PUT_LINE('前' || TO_CHAR(n) || '个' || TO_CHAR(m) || '的倍数之和为:' || TO_CHAR(get_sum_multiples (m, sn)(n))); END; /
运行结果
前5个3的倍数之和为:45
语法解析
- 函数返回值类型:
get_sum_multiples(m, sn)返回的是自定义的**关联数组(INDEX BY TABLE)**类型sum_multiples,这类集合的元素访问方式为集合变量(索引)。 - 直接索引的语法规则:
get_sum_multiples(m, sn)(n)是PL/SQL支持的函数返回集合后直接访问元素的语法,逻辑等价于先调用函数获取集合对象,再用索引访问元素,中间不需要额外分隔符(这是PL/SQL为简化代码设计的语法特性)。 - 修改后报错的原因:
TO_CHAR(get_sum_multiples (m, sn),(n))会被PL/SQL解析为向TO_CHAR传递两个参数:第一个是get_sum_multiples(m, sn)返回的集合对象,第二个是n。但TO_CHAR函数不接受集合类型作为参数,因此触发类型不匹配的编译错误。
等价代码验证
你可以将原代码拆分为两步,效果完全一致,更易理解:
DECLARE TYPE sum_multiples IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER; n PLS_INTEGER := 5; sn PLS_INTEGER := 10; m PLS_INTEGER := 3; FUNCTION get_sum_multiples(multiple IN PLS_INTEGER, num IN PLS_INTEGER) RETURN sum_multiples IS s sum_multiples; BEGIN FOR i IN 1..num LOOP s(i) := multiple * ((i * (i + 1)) / 2) ; END LOOP; RETURN s; END get_sum_multiples; temp_sum sum_multiples; -- 临时变量存储集合 BEGIN temp_sum := get_sum_multiples(m, sn); DBMS_OUTPUT.PUT_LINE('前' || TO_CHAR(n) || '个' || TO_CHAR(m) || '的倍数之和为:' || TO_CHAR(temp_sum(n))); END; /
内容的提问来源于stack exchange,提问作者Bunty Saini
相关产品推荐
相关产品推荐

