You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:13:14