pl sql成员过程来更新子类型元素的属性

时间:2019-05-24 15:44:09

标签: oracle inheritance plsql procedure subtype

创建目标车辆及其下的子类型(动力车辆和自行车)。 动力车辆下面有卡车类型。 自行车有一个成员程序set_gear_count set_gear_count采用两个参数:齿轮数和车辆ID,并更新自行车齿轮数。我应该演示如何实现和调用该方法,并显示操作结果。

我尝试实现以下类型和方法。但是我正在使用单车set_gear_count程序。更新功能不起作用

 CREATE OR REPLACE TYPE vehicle AS OBJECT(
   vehicle_id      NUMBER,
   manufacturer   VARCHAR2(20),
   purchase_date   Date,
   color varchar2(20),
  MAP MEMBER FUNCTION getvidno RETURN NUMBER,
  MEMBER FUNCTION get_vehicle RETURN varchar2)NOT FINAL;
 /
 CREATE OR REPLACE TYPE BODY vehicle AS
MAP MEMBER FUNCTION getvidno RETURN NUMBER IS
BEGIN
 RETURN vehicle_id;
END;



MEMBER FUNCTION get_vehicle RETURN VARCHAR2  IS


    BEGIN
    RETURN  'Id: ' ||  TO_CHAR(vehicle_id) || ' Manufacturer: ' || 
    manufacturer || ' purchase_date: '||  TO_CHAR(purchase_date) || ' 
    Color: ' || color;
    END ;

    END;
/ 
desc vehicle;
/
CREATE OR REPLACE TYPE powered_vehicle UNDER vehicle(
  fuel_type   VARCHAR2(20),
  license_number VARCHAR2(10),
  model VARCHAR2(10),   
  OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2 )NOT  FINAL;
 /
CREATE  OR REPLACE TYPE BODY powered_vehicle As 
     OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2  IS
     BEGIN
       RETURN (self AS vehicle).get_vehicle || ' Fuel_type: ' || fuel_type || ' license_number: ' || license_number ||' model:'|| model;
     END ;
     END;
      /
      desc powered_vehicle;

      CREATE OR REPLACE TYPE truck UNDER powered_vehicle(
  cargo_capacity NUMBER,
  OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2 
) FINAL;
/
 CREATE TYPE BODY truck As 
    OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2  IS
     BEGIN
       RETURN (self AS powered_vehicle).get_vehicle || ' cargo_capacity: ' || cargo_capacity;
     END ;
     END;    
     /
desc truck;

创建表格Vehicles_tab(    v_id varchar2(255)AS(CONCAT(vehics.vehicle_id,TO_CHAR(CONCAT('-',vehics.purchase_date))))NOT NULL,    车辆    );

ALTER TABLE vehicles_tab ADD(
CONSTRAINT vehx_pk PRIMARY KEY(v_id));

CREATE SEQUENCE vehic_seqx START WITH 1;

CREATE OR REPLACE TRIGGER  vehic_birx
BEFORE INSERT ON vehicles_tab
FOR EACH ROW 
BEGIN 
SELECT vehic_seqx.NEXTVAL
INTO :new.vehics.vehicle_id
FROM DUAL;
END;
/





 CREATE OR REPLACE TYPE bicycle UNDER vehicle (
          gear_count  NUMBER,          
         OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2 ) FINAL;
 /
  CREATE OR REPLACE TYPE BODY bicycle as
  OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2  IS
     BEGIN
       RETURN (self AS vehicle).get_vehicle || ' Gear count: ' ||TO_CHAR(gear_count) ;
     END get_vehicle;



 create  or replace type body bicylce as
  member    PROCEDURE  set_gear_count(gearcnt IN NUMBER,vid IN NUMBER)  
   Is
   begin

  UPDATE  vehicles_tab v 
  SET TREAT(VALUE v As bicycle ).vehics.gear_count=gearcnt 
  WHERE TREAT(VALUE v As bicycle).vehics.vehicle_id = vid;

 end;

 END;
     /

INSERT INTO vehicles_tab(vehics)
values(bicylce(vehic_seqx.NEXTVAL,'AVC','06-AUG-08','BLUE',5
));

INSERT INTO vehicle_tab(车辆)    值(卡车(vehic_seqx.NEXTVAL,'MERCEDEZ','12-AUG-11','BLACK','',     '','',34));

从Vehicles_tab v中选择v.vehics.get_vehicle();

SET SERVEROUTPUT ON; declare ``v_bicycle Bicycle:= new Bicycle('1-2019','AVC','06-AUG-08','BLUE',5);

    `` begin
   v_bicycle.set_gear_count('1-2019',9);
 end;

SELECT v.vehics.get_vehicle() from vehicles_tab v;

0 个答案:

没有答案