Позволяет ли Oracle просто указывать ожидаемые типы данных для ЗАПИСИ без объявления записи в вызове процедуры? - PullRequest
2 голосов
/ 25 июня 2019

Аналогично работе, проделанной в этом посте Мне любопытно узнать, возможно ли сделать что-то подобное с составными типами данных.

Пример того, что япытаясь, но никогда не видел, чтобы это работало.

/* 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;

Смотрите это в действии.

enter image description here

1 Ответ

1 голос
/ 25 июня 2019

Вы должны иметь дело с типом объекта, чтобы иметь конструктор такого типа. Простые типы записей не имеют такой способности. Например, следующее будет работать.

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;
/

Ссылка на отсутствие синтаксиса конструктора типа RECORD .

...