存储过程中的类型验证 - 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?
这是行不通的。只需创建一个类型并在所有包中使用它。
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 referencingpackage2.myType
. Subtypes? or is there a way to do it directly?
这是行不通的。只需创建一个类型并在所有包中使用它。