Oracle表值函数创建报PLS-00306错误求解决(原SQL Server用户)
问题排查与解决
错误原因很明确:你在PIPE ROW中错误调用了表类型tbl_creatinines的构造函数,但管道函数需要的是单个行对象(即tbl_lab_row类型的实例),而非整个表集合。
修正后的完整代码如下:
CREATE OR REPLACE TYPE tbl_lab_row AS OBJECT ( EVENT_END_DT_TM DATE, RESULT_VAL VARCHAR2(255 CHAR), RESULT_UNITS_CD NUMBER, EVENT_CD NUMBER ); CREATE OR REPLACE TYPE tbl_creatinines AS TABLE OF tbl_lab_row; CREATE OR REPLACE FUNCTION tvf_creatinine_for_enc(p_enc_id NUMBER) RETURN tbl_creatinines PIPELINED IS BEGIN FOR r IN (SELECT EVENT_END_DT_TM, RESULT_VAL, RESULT_UNITS_CD, EVENT_CD FROM SCHEMA.TABLE WHERE ENCNTR_ID = p_enc_id AND EVENT_CD IN(...)) -- 替换为你的实际代码 LOOP -- 修正:调用行对象tbl_lab_row的构造函数,生成单个行实例 PIPE ROW (tbl_lab_row(r.EVENT_END_DT_TM, r.RESULT_VAL, r.RESULT_UNITS_CD, r.EVENT_CD)); END LOOP; RETURN; END; /
关键说明
- Oracle管道表值函数中,
PIPE ROW接收的是单个对象实例(对应你的行类型tbl_lab_row),而非表类型tbl_creatinines。表类型仅用于定义函数返回的集合结构。 - 和SQL Server表值函数不同,Oracle需先定义行对象类型,再基于行对象定义表类型,管道函数逐个生成行对象并输出。
内容的提问来源于stack exchange,提问作者Xaxum
相关产品推荐
相关产品推荐

