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

Oracle嵌套过程中引用表列类型声明变量报错求助

Oracle嵌套过程中引用表列类型变量的报错解决

问题场景

在DBeaver Community 23.0.3版本中编写Oracle嵌套PL/SQL块时,子过程内声明表名.列名%TYPE类型的变量会触发语法错误,但全局变量使用相同类型、子过程使用%ROWTYPE类型均能正常运行。

报错代码

DECLARE 
    GLOBAL_VAR AREA.AREA_CD_AREA_UID%TYPE := 0;
    PROCEDURE SUB_TEST(SUB_PAR NUMBER)
    IS 
        SUB_VAR_1 NUMBER := 0;
        SUB_VAR_2 AREA.AREA_CD_AREA_UID%TYPE := 0;
    BEGIN
        DBMS_OUTPUT.PUT_LINE('SUB_TEST');
    END SUB_TEST;

BEGIN
    DBMS_OUTPUT.PUT_LINE(GLOBAL_VAR);    
    SUB_TEST(1);
END;

错误信息

Error occurred during SQL script execution

Reason:
SQL Error [6550] [65000]: ORA-06550: line 9, column 14:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   begin function pragma procedure

排查结果

  • 移除子过程中的SUB_VAR_2声明后,代码可正常运行
  • 全局变量GLOBAL_VAR使用AREA.AREA_CD_AREA_UID%TYPE类型无任何问题
  • 将子过程内变量改为AREA%ROWTYPE类型时,代码执行正常,可行代码如下:
DECLARE 
    GLOBAL_VAR AREA.AREA_CD_AREA_UID%TYPE := 0;
    PROCEDURE SUB_TEST(SUB_PAR NUMBER)
    IS 
        SUB_VAR_1 NUMBER := 0;
--      SUB_VAR_2 AREA.AREA_CD_AREA_UID%TYPE := 0;
        SUB_REC AREA%ROWTYPE;
    BEGIN
        DBMS_OUTPUT.PUT_LINE('SUB_TEST');
    END SUB_TEST;

BEGIN
    DBMS_OUTPUT.PUT_LINE(GLOBAL_VAR);    
    SUB_TEST(1);
END;

可行解决方案

方案1:使用%ROWTYPE替代

声明表行类型变量,后续通过.访问目标列:

DECLARE 
    GLOBAL_VAR AREA.AREA_CD_AREA_UID%TYPE := 0;
    PROCEDURE SUB_TEST(SUB_PAR NUMBER)
    IS 
        SUB_VAR_1 NUMBER := 0;
        SUB_REC AREA%ROWTYPE;
    BEGIN
        SUB_REC.AREA_CD_AREA_UID := 0; -- 访问目标列
        DBMS_OUTPUT.PUT_LINE('SUB_TEST');
    END SUB_TEST;

BEGIN
    DBMS_OUTPUT.PUT_LINE(GLOBAL_VAR);    
    SUB_TEST(1);
END;

方案2:定义类型别名

在全局声明部分定义列类型的别名,子过程内直接使用别名:

DECLARE 
    -- 定义类型别名
    TYPE AREA_UID_TYPE IS AREA.AREA_CD_AREA_UID%TYPE;
    GLOBAL_VAR AREA_UID_TYPE := 0;
    PROCEDURE SUB_TEST(SUB_PAR NUMBER)
    IS 
        SUB_VAR_1 NUMBER := 0;
        SUB_VAR_2 AREA_UID_TYPE := 0; -- 使用别名
    BEGIN
        DBMS_OUTPUT.PUT_LINE('SUB_TEST');
    END SUB_TEST;

BEGIN
    DBMS_OUTPUT.PUT_LINE(GLOBAL_VAR);    
    SUB_TEST(1);
END;

内容的提问来源于stack exchange,提问作者lsborg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:12:58