Oracle 将记录类型作为参数传递有什么不对

Oracle 将记录类型作为参数传递有什么不对,oracle,plsql,Oracle,Plsql,我有以下代码片段: CREATE OR REPLACE PACKAGE pkg_test1 IS TYPE t_rec1 is RECORD(c1 number); FUNCTION f1(p1 t_rec1 ) RETURN VARCHAR2; END pkg_test1; CREATE OR REPLACE PACKAGE BODY pkg_test1 IS FUNCTION f1 (p1 t_rec1) return varchar2 is BEGIN RETU

我有以下代码片段:

CREATE OR REPLACE PACKAGE pkg_test1 IS
  TYPE t_rec1 is RECORD(c1 number);
  FUNCTION f1(p1 t_rec1 ) RETURN VARCHAR2;
END pkg_test1;


CREATE OR REPLACE PACKAGE BODY pkg_test1 IS 
FUNCTION f1 (p1 t_rec1) return varchar2 is 
  BEGIN
    RETURN 'a';
  END f1;
END pkg_test1;

DECLARE
TYPE t_rec IS RECORD (c1 NUMBER);
v_rec t_rec;  
v_var VARCHAR2(15);

BEGIN
v_rec.c1 := 1;
v_var := pkg_test1.f1 (v_rec);
END;
当我执行匿名代码时,我收到以下错误:

PLS-00306:调用“F1”时参数的数量或类型错误


有人能帮我看看我犯的错误吗?

您在匿名块中声明的类型在您看来是相同的,但在Oracle看来,它是一个完全独立且不兼容的类型

:

包规范中定义的记录类型与相同定义的本地记录类型不兼容

但是你不需要它;只需使用包类型:

DECLARE
  -- don't create a new type....
  --TYPE t_rec IS RECORD (c1 NUMBER);
  --v_rec t_rec;  
  -- use the package type instead
  v_rec pkg_test1.t_rec1;  
  v_var VARCHAR2(15);

BEGIN
  v_rec.c1 := 1;
  v_var := pkg_test1.f1 (v_rec);
END;