Oracle数据库中互相调用的函数编译报错,如何实现互调?
解决PL/SQL函数互相调用的编译错误问题
你编写的两个PL/SQL函数PROCESS_OPERATOR和PROCESS_WHERE因互相调用导致编译报错,错误提示为:
PLS-00905: object SYS.PROCESS_WHERE is invalid PLS-00905: object SYS.PROCESS_OPERATOR is invalid
原代码如下:
CREATE OR REPLACE FUNCTION PROCESS_OPERATOR ( p_operator IN VARCHAR2 ) RETURN VARCHAR2 IS l_result VARCHAR2(100); BEGIN l_result := PROCESS_WHERE('test'); RETURN l_result; END; / CREATE OR REPLACE FUNCTION PROCESS_WHERE ( p_where IN VARCHAR2 ) RETURN VARCHAR2 IS l_result VARCHAR2(100); BEGIN l_result := PROCESS_OPERATOR('test'); RETURN l_result; END; /
解决方法:使用函数存根(Stub)分步创建
PL/SQL编译时需要确认被调用对象的存在,直接同时创建互相调用的函数会导致编译器找不到依赖对象。通过先创建函数存根(仅定义函数签名,临时实现),再依次完成完整函数的创建即可解决:
- 先创建
PROCESS_WHERE的存根函数
CREATE OR REPLACE FUNCTION PROCESS_WHERE ( p_where IN VARCHAR2 ) RETURN VARCHAR2 IS BEGIN RETURN NULL; -- 临时返回值,后续替换为完整逻辑 END; /
- 创建完整的
PROCESS_OPERATOR函数
此时PROCESS_WHERE已存在(存根),编译器可以识别其签名,函数能正常编译:
CREATE OR REPLACE FUNCTION PROCESS_OPERATOR ( p_operator IN VARCHAR2 ) RETURN VARCHAR2 IS l_result VARCHAR2(100); BEGIN l_result := PROCESS_WHERE('test'); RETURN l_result; END; /
- 替换
PROCESS_WHERE为完整实现
此时PROCESS_OPERATOR已编译完成,PROCESS_WHERE可以正常调用它:
CREATE OR REPLACE FUNCTION PROCESS_WHERE ( p_where IN VARCHAR2 ) RETURN VARCHAR2 IS l_result VARCHAR2(100); BEGIN l_result := PROCESS_OPERATOR('test'); RETURN l_result; END; /
原理说明
函数存根提供了编译器需要的函数签名信息,让第一个完整函数能通过编译;当两个函数都有有效定义后,互相调用的逻辑就能正常工作。
内容的提问来源于stack exchange,提问作者Александр Исаеня
相关产品推荐
相关产品推荐

