Oracle SQL如何将查询返回的列表值传入单参数函数完成批量调用
实现方案
你直接在原查询的列中调用对应函数即可,不需要额外做逐行遍历的逻辑,Oracle原生支持在SELECT语句中直接调用合法的存储函数,参考SQL如下:
SELECT person_id, package1.get_person_company(person_id) AS get_person_company_result FROM per_all_people_f;
注意事项
per_all_people_f是Oracle EBS的日期生效维度表,如果只需要查询当前有效的人员数据,建议加上生效日期过滤条件,避免返回重复的历史人员数据:SELECT person_id, package1.get_person_company(person_id) AS get_person_company_result FROM per_all_people_f WHERE TRUNC(SYSDATE) BETWEEN effective_start_date AND effective_end_date;- 如果你的函数内部包含DML(增删改)操作,无法直接在SELECT语句中调用,可以用PL/SQL循环+临时表的方式实现:
-- 1. 创建临时表存储结果 CREATE GLOBAL TEMPORARY TABLE person_company_res ( person_id NUMBER, company_res VARCHAR2(200) ) ON COMMIT PRESERVE ROWS; -- 2. 循环遍历person_id调用函数写入结果 DECLARE BEGIN FOR person_rec IN (SELECT person_id FROM per_all_people_f /* 可加自定义过滤条件 */) LOOP INSERT INTO person_company_res(person_id, company_res) VALUES (person_rec.person_id, package1.get_person_company(person_rec.person_id)); END LOOP; COMMIT; END; / -- 3. 查询最终结果 SELECT * FROM person_company_res; - 如果数据量较大,逐行调用函数性能较低,建议优先考虑把函数逻辑拆解为表关联逻辑,避免逐行函数调用的开销。
内容的提问来源于stack exchange,提问作者osfar
相关产品推荐
相关产品推荐

