Oracle 是否允许您简单地为 RECORD 提供预期的数据类型而无需在过程调用中声明记录?

Does Oracle Allow you to simply supply the expected data types for a RECORD without Declaring the Record within a Procedure Call?

与此 中完成的工作类似,我很想知道是否可以对复合数据类型执行类似的操作。

我正在尝试但从未见过它起作用的示例。

/* Is it possible somehow to instead do THIS? */
tst_proc_rec_type(p_rec    =>  (sys.odcivarchar2list('dan','bob')
                              , sys.odcivarchar2list('anderson','bebop'))
);

出于某种原因,我一直回到这个概念,多年来我从未见过让它发挥作用的方法......很可能是因为它根本不可能,但我决定伸出援手对社区希望也许这是可能的,也许我只是做错了。 (不会是第一次)。

工作代码示例和显示我正在尝试执行的更改代码。

DECLARE

  TYPE t_tst_rec IS RECORD (
    fname   sys.odcivarchar2list,
    lname   sys.odcivarchar2list
  );

  iamrecord   t_tst_rec; /* Declare record of type t_tst_rec */

PROCEDURE tst_proc_rec_type(p_rec t_tst_rec)
IS

BEGIN

  FOR i IN 1..p_rec.lname.COUNT
  LOOP

    dbms_output.put_line(p_rec.lname(i) ||', ' || p_rec.fname(i));

  END LOOP;

END;

BEGIN

  iamrecord.fname :=  sys.odcivarchar2list('dan','bob');
  iamrecord.lname :=  sys.odcivarchar2list('anderson','bebop');

  tst_proc_rec_type(p_rec    =>  iamrecord
  );

  /* Is it possible somehow to instead do THIS? */
--  tst_proc_rec_type(p_rec    =>  (sys.odcivarchar2list('dan','bob')
--                                , sys.odcivarchar2list('anderson','bebop'))
--  );

END;

查看实际效果。

您需要处理对象类型才能拥有此类构造函数。简单的记录类型没有这种能力。例如,以下将起作用。

CREATE OR REPLACE TYPE t_tst_rec AS OBJECT
(
   fname sys.odcivarchar2list,
   lname sys.odcivarchar2list,
   CONSTRUCTOR FUNCTION t_tst_rec
   (
      fname sys.odcivarchar2list,
      lname sys.odcivarchar2list
   ) RETURN SELF AS RESULT
);

CREATE OR REPLACE TYPE BODY t_tst_rec AS

   CONSTRUCTOR FUNCTION t_tst_rec
   (
      fname sys.odcivarchar2list,
      lname sys.odcivarchar2list
   ) RETURN SELF AS RESULT IS
   BEGIN
      self.fname := fname;
      self.lname := lname;
      RETURN;
   END t_tst_rec;

END;
/

DECLARE
   iamrecord t_tst_rec; /* Declare record of type t_tst_rec */

   PROCEDURE tst_proc_rec_type(p_rec t_tst_rec) IS
   BEGIN
      FOR i IN 1 .. p_rec.lname.count LOOP
         dbms_output.put_line(p_rec.lname(i) || ', ' || p_rec.fname(i));
      END LOOP;
   END;

BEGIN
   tst_proc_rec_type(t_tst_rec(sys.odcivarchar2list('dan', 'bob')
                              ,sys.odcivarchar2list('anderson', 'bebop')));

END;
/

参考 lack of a RECORD type constructor syntax