代码之家  ›  专栏  ›  技术社区  ›  Niels

在包内调用Oracle SQL(PL SQL)过程会返回错误

  •  0
  • Niels  · 技术社区  · 2 年前

    我正在尝试创建一个包,其中包含在表中插入行的过程。

    包标题:

    CREATE OR REPLACE PACKAGE pkg_developers
    AS
        PROCEDURE empty_tables;
        PROCEDURE add_city(country IN CITIES.COUNTRY%type, zipcode IN CITIES.ZIPCODE%type, city IN CITIES.CITY%type);
    END pkg_developers;
    

    包体:

    CREATE OR REPLACE PACKAGE BODY pkg_developers AS
    
        PROCEDURE empty_tables
        IS
        BEGIN
            EXECUTE IMMEDIATE 'TRUNCATE TABLE cities CASCADE';
            /* More truncate statements*/
            DBMS_OUTPUT.put_line('Tables truncated successfully.');
        END empty_tables;
    
        PROCEDURE add_city(p_country IN cities.COUNTRY%type, p_zipcode IN cities.ZIPCODE%type, p_city IN cities.CITY%type)
        IS
        BEGIN
            INSERT INTO CITIES(COUNTRY, ZIPCODE, city) VALUES(p_country, p_zipcode, p_city);
            COMMIT;
        END add_city;
    
    END pkg_developers;
    

    我如何执行程序:

    BEGIN
        pkg_developers.empty_tables();
        pkg_developers.add_city('Country', '1111', 'City');
    END;
    

    我得到的错误是:

    [2022-04-16 11:41:48] [72000][4063]
    [2022-04-16 11:41:48]   ORA-04063: package body "PROJECT.PKG_DEVELOPERS" has errors
    [2022-04-16 11:41:48]   ORA-06508: PL/SQL: could not find program unit being called: "PROJECT.PKG_DEVELOPERS"
    [2022-04-16 11:41:48]   ORA-06512: at line 2
    [2022-04-16 11:41:48] Position: 0
    [2022-04-16 11:41:48] Summary: 1 of 1 statements executed, 1 failed in 15 ms (106 symbols in file)
    

    我确实发现如果我删除了程序的参数 add_city 对这些值进行硬编码确实有效,但我一辈子都搞不清楚这些参数会有什么问题,我在网上看过一些例子,它们似乎和我一样。

    我也尝试调用完全相同的过程,但不在包内,然后它也可以正常工作。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Littlefoot    2 年前

    阅读 上面写着:

    包体“PROJECT.PKG_DEVELOPERS”有错误

    你不能调用无效的包(好吧,你可以 可以 -就像你已经做的那样——但你知道结果)。

    怎么了?乍一看,这是:

    包装规格说明如下:

    PROCEDURE add_city (country IN CITIES.COUNTRY%type, 
                        zipcode IN CITIES.ZIPCODE%type, 
                        city    IN CITIES.CITY%type);
    

    包装体上写着:

    PROCEDURE add_city (p_country IN cities.COUNTRY%type, 
                        p_zipcode IN cities.ZIPCODE%type, 
                        p_city    IN cities.CITY%type)
    

    找出区别。如果不能,那么:在包体中,所有参数都有前缀 p_ (这是正确的,即优于包装规范中的声明)。无论您选择哪个选项(我建议使用带有前缀的owe),请在规范和正文中使用它。