Как я могу использовать тип REF в PL / SQL Oracle? - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть этот код:

CREATE OR REPLACE TYPE t_abonnement_type AS OBJECT
(
  ref_abonnement_type NUMBER,
  type_abonne         VARCHAR(50),
  MEMBER PROCEDURE DISPLAY
);

CREATE OR REPLACE TYPE t_abonnement AS OBJECT
(
  ref_abonnement           NUMBER,
  date_debut               DATE,
  type_abonnement          REF t_abonnement_type,
  MEMBER PROCEDURE DISPLAY
);

То, что я хочу сделать, - это просто создать процедуры членов, объявленные DISPLAY.Итак, я сделал это следующим образом:

    CREATE OR REPLACE TYPE BODY t_abonnement AS
  MEMBER PROCEDURE DISPLAY IS
    BEGIN
        /* SOME CODE */
        type_abonnement.display;
    END;
END;

И я получаю эту ошибку

PLS-00536: Navigation through REF variables is not supported in PL/SQL.

Так, как я могу иметь дело с REF в инструкциях PL / SQL?Спасибо

1 Ответ

0 голосов
/ 31 декабря 2018

Как упоминалось @APC, невозможно напрямую использовать member функцию Object для другой, используя REF, поскольку Oracle поддерживает их в SQL, но не в PL / SQL.

Однако, если я посмотрю на ваше требование под другим углом, я пойму, что вы пытаетесь просто использовать процедуру, используемую в объекте, для другого объекта.Означает, что если я забуду ссылающуюся часть и создам сценарий, который мог бы удовлетворить концепцию обращения, тогда он должен "ОК".

Это возможно.Да..!!!Это можно сделать.Единственное, что я сделал здесь, это сделал два Объекта родительскими и дочерними для достижения referencing.См. Демонстрацию ниже:

--Parent Object
CREATE OR REPLACE TYPE t_abonnement_type AS OBJECT
(
  ref_abonnement_type NUMBER,
  type_abonne         VARCHAR(50),
   MEMBER FUNCTION DISPLAY return varchar2
) NOT FINAL; 

-- Member Funtion Body
CREATE OR REPLACE TYPE BODY t_abonnement_type
AS
  MEMBER FUNCTION DISPLAY 
  return varchar2
  IS
  BEGIN
   return ('Hi');
  END DISPLAY;
END;

Тестирование моего родительского объекта:

SQL> SELECT t_abonnement_type(1,'a').display() col from DUAL;  

    COL
    ---
    Hi

Дочерний объект для достижения ссылки concept

CREATE OR REPLACE TYPE t_abonnement 
under t_abonnement_type  
(
  ref_abonnement           NUMBER,
  date_debut               DATE,
  MEMBER function V_DISPLAY return varchar2
);

--Member function 
CREATE OR REPLACE TYPE BODY t_abonnement
AS
  MEMBER Function V_DISPLAY  return varchar2
  IS
  var varchar2(10);
  BEGIN      
     var:=  t_abonnement_type(1,'A').display(); --Calling Parent Member function here
     return('Called from Child Object -->'||var);
  END;
END;

Тестирование моегоДочерний объект, чтобы проверить, есть ли ссылка на родительский элемент Member function:

SQL> SELECT T_ABONNEMENT(1,'A',2,TO_DATE('30-JUN-2018','DD-MON-YYYY')).V_DISPLAY() COL FROM DUAL;

Col
---
Called from Child Object -->Hi

Примечание. Я не использовал перегрузку, выполненную в вашем коде, поскольку я чувствую, что перегрузка усложняет понимание материала как отдельного человекакак для компилятора.

...