在plqsl块内的Oracle嵌套过程中声明引用表列类型的变量

vjhs03f7  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(109)

我在Oracle嵌套过程中声明引用表列类型的变量时出错。我使用的是DBeaver社区23。0.3.202304240616.
代码如下:

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显示类型有效,则可以工作。
本文有一些子程序示例,但没有一个在嵌套过程中使用自定义类型。有一个行类型的,它也适用于我改变SUB_VAR_2类型为AREA%ROWTYPE

编辑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_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;
n7taea2i

n7taea2i1#

当我在Oracle 21c XE上运行此命令时

set serveroutput on size unlimited

create table area (
  AREA_CD_AREA_UID  number(9)
)
/

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;
/

我明白了

SQL> 

Table created

0
SUB_TEST

PL/SQL procedure successfully completed

SQL>

我也是这么想的。
所以我能想到的是,这可能是你的数据库有问题,或者是你的问题中排除的一些代码有问题。

相关问题