架构中的相同存储过程不起作用包

The same stored procedure in schema doesn't work package

我在包中有以下存储过程:

CREATE OR REPLACE PROCEDURE P_TRUNC_I_SUB_PARTITION (
      P_TABLE_NAME   IN VARCHAR2,
      P_STICHTAG     IN NUMBER,
      P_SUB_ID       IN VARCHAR2 DEFAULT '*')
   IS
      SQL_TRUNCATE                   VARCHAR2 (4000);
      VVPRUEF                        VARCHAR2 (4000);
      SQL_ADD_SUBPARTITION           VARCHAR2 (4000);
      PROOF_IF_DATA                  VARCHAR2 (4000);
      PARTITION_DOES_EXIST           EXCEPTION;
      PRAGMA EXCEPTION_INIT (PARTITION_DOES_EXIST, -14622);
 
      PARTITION_DOES_NOT_EXIST_SUB   EXCEPTION;
      PRAGMA EXCEPTION_INIT (PARTITION_DOES_NOT_EXIST_SUB, -14702);
      PARTITION_DOES_NOT_EXIST2      EXCEPTION;
      PRAGMA EXCEPTION_INIT (PARTITION_DOES_NOT_EXIST2, -02149);
   BEGIN
      -- Wenn keine bestimmte Subpartition angegeben ist, dann truncate auf Partition Ebene
      IF P_SUB_ID = '' OR P_SUB_ID = '*'
      THEN
         SQL_TRUNCATE :=
               'ALTER TABLE '
            || P_TABLE_NAME
            || ' TRUNCATE PARTITION FOR ('
            || P_STICHTAG
            || ') UPDATE INDEXES';
      ELSE
         SQL_TRUNCATE :=
               'ALTER TABLE '
            || P_TABLE_NAME
            || ' TRUNCATE SUBPARTITION FOR ('
            || P_STICHTAG
            || ','
            || ''''
            || P_SUB_ID
            || ''''
            || ') UPDATE INDEXES';
      END IF;
 
      EXECUTE IMMEDIATE (SQL_TRUNCATE);
   EXCEPTION
      -- Wenn diese bestimmte Subpartition bereits vorhanden ist, dann leere sie
      WHEN PARTITION_DOES_NOT_EXIST2
      THEN
         DBMS_OUTPUT.PUT_LINE (SQLERRM);
         NULL;
      WHEN PARTITION_DOES_NOT_EXIST_SUB
      THEN
         DBMS_OUTPUT.PUT_LINE (SQLERRM);
         NULL;
      WHEN OTHERS
      THEN
         RAISE_APPLICATION_ERROR (
            -20002,
            'P_TRUNC_I_SUB_PARTITION(): ' || SUBSTR (SQLERRM, 1, 500));
   END P_TRUNC_I_SUB_PARTITION;

在模式中它起作用:

CALL BAISMART.P_TRUNC_I_SUB_PARTITION('TABLE_NAME', 20220126, 'PURTITION_NAME')

但是当我从包中调用它时:

CALL BAISMART.PCK_BAIS_UTIL.P_TRUNC_I_SUB_PARTITION('TABLE_NAME', 20220126, 'PURTITION_NAME')

我收到一个错误:

SQL Error [6553] [65000]: ORA-06553: PLS-306: wrong number or types of arguments in call to 'P_TRUNC_I_SUB_PARTITION'.

包本身的代码:


-- DROP PACKAGE BAISMART.PCK_BAIS_UTIL;
 
CREATE OR REPLACE PACKAGE BAISMART.PCK_BAIS_UTIL
AS
   PROCEDURE P_TRUNC_I_SUB_PARTITION;
END PCK_BAIS_UTIL;
 
 
 
CREATE OR REPLACE PACKAGE BODY BAISMART.PCK_BAIS_UTIL
AS
     ------------------------
  PROCEDURE P_TRUNC_I_SUB_PARTITION (
      P_TABLE_NAME   IN VARCHAR2,
      P_STICHTAG     IN NUMBER,
      P_SUB_ID       IN VARCHAR2 DEFAULT '*')
   IS
      SQL_TRUNCATE                   VARCHAR2 (4000);
      VVPRUEF                        VARCHAR2 (4000);
      SQL_ADD_SUBPARTITION           VARCHAR2 (4000);
      PROOF_IF_DATA                  VARCHAR2 (4000);
      PARTITION_DOES_EXIST           EXCEPTION;
      PRAGMA EXCEPTION_INIT (PARTITION_DOES_EXIST, -14622);
 
      PARTITION_DOES_NOT_EXIST_SUB   EXCEPTION;
      PRAGMA EXCEPTION_INIT (PARTITION_DOES_NOT_EXIST_SUB, -14702);
      PARTITION_DOES_NOT_EXIST2      EXCEPTION;
      PRAGMA EXCEPTION_INIT (PARTITION_DOES_NOT_EXIST2, -02149);
   BEGIN
      -- Wenn keine bestimmte Subpartition angegeben ist, dann truncate auf Partition Ebene
      IF P_SUB_ID = '' OR P_SUB_ID = '*'
      THEN
         SQL_TRUNCATE :=
               'ALTER TABLE '
            || P_TABLE_NAME
            || ' TRUNCATE PARTITION FOR ('
            || P_STICHTAG
            || ') UPDATE INDEXES';
      ELSE
         SQL_TRUNCATE :=
               'ALTER TABLE '
            || P_TABLE_NAME
            || ' TRUNCATE SUBPARTITION FOR ('
            || P_STICHTAG
           || ','
            || ''''
            || P_SUB_ID
            || ''''
            || ') UPDATE INDEXES';
      END IF;
 
      EXECUTE IMMEDIATE (SQL_TRUNCATE);
   EXCEPTION
      -- Wenn diese bestimmte Subpartition bereits vorhanden ist, dann leere sie
      WHEN PARTITION_DOES_NOT_EXIST2
      THEN
         DBMS_OUTPUT.PUT_LINE (SQLERRM);
         NULL;
      WHEN PARTITION_DOES_NOT_EXIST_SUB
      THEN
         DBMS_OUTPUT.PUT_LINE (SQLERRM);
         NULL;
      WHEN OTHERS
      THEN
         RAISE_APPLICATION_ERROR (
            -20002,
            'P_TRUNC_I_SUB_PARTITION(): ' || SUBSTR (SQLERRM, 1, 500));
   END P_TRUNC_I_SUB_PARTITION;
 
 
END PCK_BAIS_UTIL;

有人知道为什么会发生这种情况吗?

您的包裹规格与正文不符;所以你会从正文中得到一个编译错误,你的调用 will get PLS-00306.

您的规格说明:

   PROCEDURE P_TRUNC_I_SUB_PARTITION;

所以这个过程没有参数。那应该匹配正文:

   PROCEDURE P_TRUNC_I_SUB_PARTITION (
      P_TABLE_NAME   IN VARCHAR2,
      P_STICHTAG     IN NUMBER,
      P_SUB_ID       IN VARCHAR2 DEFAULT '*'
   );

db<>fiddle 修改后的规范。