存储过程中的类型验证 - oracle

Type validation within stored procedures - oracle

oracle 存储过程如何处理两种不同的类型,它们具有完全相同的类型声明,只是它们存储在两个不同的包中? 例子: package1 有类型,

Type myType Is Table Of VARCHAR2(40) Index By Binary_Integer;

package2 有类型,

Type myType Is Table Of VARCHAR2(40) Index By Binary_Integer;

现在,如果我使用存储在 package2 中的存储过程(参数 => myType)并在 package1 中进行调用(输入 => myType),这会引发错误

PLS-00306: wrong number or types of arguments in call to

oracle 是否将这些作为不同类型来处理,而没有内部检查这两种类型是否 'table of varchar(40)'?

另外,让 package1 myType 引用 package2 myType 的最佳方法是什么。亚型?还是有办法直接做?

谢谢

类型签名是否相同并不重要,package1.mytype 永远不会与 package2.mytype 相同类型,因为它们是在两个不同的地方声明的,所以它们并不相同。

如果你想在包之间传递类型,那么只需在一个地方声明类型,然后在所有不同的包中使用它。

例如:

CREATE PACKAGE package1
AS
  Type myType Is Table Of VARCHAR2(40) Index By Binary_Integer;
  
  PROCEDURE proc(
    value IN package1.mytype
  );
END;
/

CREATE PACKAGE BODY package1
AS
  PROCEDURE proc(
    value IN package1.mytype
  )
  IS
    i PLS_INTEGER;
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Package 1:');
    i := value.FIRST;
    WHILE i IS NOT NULL LOOP
      DBMS_OUTPUT.PUT_LINE( i || ': ' || value(i) );
      i := value.NEXT(i);
    END LOOP;
  END;
END;
/

不声明package2中的类型,使用package1:

中的类型
CREATE PACKAGE package2
AS
  PROCEDURE proc(
    value IN package1.mytype
  );
END;
/

CREATE PACKAGE BODY package2
AS
  PROCEDURE proc(
    value IN package1.mytype
  )
  IS
    i PLS_INTEGER;
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Package 2:');
    i := value.FIRST;
    WHILE i IS NOT NULL LOOP
      DBMS_OUTPUT.PUT_LINE( i || ': ' || value(i) );
      i := value.NEXT(i);
    END LOOP;
  END;
END;
/

然后:

DECLARE
  value PACKAGE1.MYTYPE;
BEGIN
  value(2) := 'ABC';
  value(4) := 'DEF';
  value(5) := 'GHI';
  value(9) := 'JKL';
  
  PACKAGE1.PROC(value);
  PACKAGE2.PROC(value);
END;
/

输出:

Package 1:
2: ABC
4: DEF
5: GHI
9: JKL
Package 2:
2: ABC
4: DEF
5: GHI
9: JKL

db<>fiddle here


Does oracle handle these as different with no internal check for whether both types are 'table of varchar(40)'?

是的,package1 != package2 因此 package1.mytype != package2.mytype 无论 package1.mytype 的签名是否与 package2.mytype 的签名相同。


what's the best way I can make package1.myType be referencing package2.myType. Subtypes? or is there a way to do it directly?

这是行不通的。只需创建一个类型并在所有包中使用它。