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
相关产品推荐
相关产品推荐

