/*
CREATE OR REPLACE TYPE person_typ AS OBJECT (
 idno           NUMBER,
 name           VARCHAR2(30),
 phone          VARCHAR2(20),
 MAP MEMBER FUNCTION get_idno RETURN NUMBER,
 MEMBER FUNCTION show RETURN VARCHAR2)
 NOT FINAL;
/
*/

CREATE OR REPLACE TYPE Ordenador AS OBJECT (
    referencia CHAR (7),
    marca VARCHAR2 (20),
    procesador VARCHAR2(20),
    capacidadRam VARCHAR2 (20),
    capacidadDisco NUMBER,
    precio NUMBER(4,2),
    stock NUMBER,
    
    MEMBER FUNCTION getRam RETURN VARCHAR2,
    MEMBER FUNCTION getDisco RETURN NUMBER,
    MEMBER FUNCTION getCPU RETURN VARCHAR2,
    MEMBER FUNCTION calculaPrecioDescuento (descuento INT) RETURN NUMBER,
    MEMBER FUNCTION stockSuficiente (cantidadPedido INT) RETURN NUMBER,
    MEMBER PROCEDURE mostrarInfo

)NOT FINAL;
/
/* 
CREATE OR REPLACE TYPE BODY person_typ AS
 MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
 BEGIN
   RETURN idno;
 END;
-- function that can be overriden by subtypes
 MEMBER FUNCTION show RETURN VARCHAR2 IS
 BEGIN
   RETURN 'Id: ' || TO_CHAR(idno) || ', Name: ' || name;
 END;
 
END;
/
*/

CREATE OR REPLACE TYPE BODY Ordenador AS
  MEMBER FUNCTION getRam RETURN VARCHAR2 IS
  BEGIN
      RETURN capacidadRam;
  END;
  MEMBER FUNCTION getDisco RETURN NUMBER IS 
  BEGIN
      RETURN capacidadDisco/1024;
  END;
  MEMBER FUNCTION getCPU RETURN VARCHAR2 IS
  BEGIN
      RETURN procesador;
  END;
  MEMBER FUNCTION calculaPrecioDescuento (descuento INT) RETURN NUMBER IS
  BEGIN
      RETURN precio - descuento;
  END;
  MEMBER FUNCTION stockSuficiente (cantidadPedido INT) RETURN NUMBER IS
  BEGIN
      IF stock>= cantidadPedido THEN
              RETURN 1;
      ELSE
              RETURN 0;
      END IF;
  END;
  MEMBER PROCEDURE mostrarInfo AS
  BEGIN
      DBMS_OUTPUT.PUT_LINE('DATOS DEL ORDENADOR');
      DBMS_OUTPUT.PUT_LINE('marca:' || marca);
      DBMS_OUTPUT.PUT_LINE('procesador:' || procesador);
      DBMS_OUTPUT.PUT_LINE('RAM:' || capacidadRam);
      DBMS_OUTPUT.PUT_LINE('Disco:' || capacidadDisco);
      DBMS_OUTPUT.PUT_LINE('Precio:' || precio);
  END mostrarInfo;
END;
/  

/* 
        

-- requires Ex. 2-14
CREATE TYPE student_typ UNDER person_typ (
   dept_id NUMBER,
   major VARCHAR2(30),
   OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2)
   NOT FINAL;
/
*/

CREATE OR REPLACE TYPE Portatil UNDER Ordenador (
    tamanoPantalla NUMBER,
    tactil INT,
    funda INT,
    
    MEMBER FUNCTION esTactil RETURN INT,
    MEMBER FUNCTION tieneFunda RETURN INT,
    OVERRIDING MEMBER PROCEDURE mostrarInfo
);
/

/*
CREATE TYPE BODY student_typ AS
 OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS
 BEGIN
    RETURN (self AS person_typ).show || ' -- Major: ' || major ;
 END;
 
END;
/
*/

CREATE OR REPLACE TYPE BODY Portatil AS
  MEMBER FUNCTION esTactil RETURN INT IS
  BEGIN
    IF tactil = 1 THEN
        RETURN 1;
    ELSE
        RETURN 0;
    END IF;
  END;
  MEMBER FUNCTION tieneFunda RETURN INT IS
  BEGIN
    IF funda = 1 THEN
          RETURN 1;
      ELSE
          RETURN 0;
    END IF;
  END;

  OVERRIDING MEMBER PROCEDURE mostrarInfo AS
  BEGIN
      DBMS_OUTPUT.PUT_LINE('DATOS DEL ORDENADOR');
      DBMS_OUTPUT.PUT_LINE('marca:' || marca);
      DBMS_OUTPUT.PUT_LINE('CPU:' || procesador);
      DBMS_OUTPUT.PUT_LINE('RAM:' || capacidadRam);
      DBMS_OUTPUT.PUT_LINE('Disco:' || capacidadDisco);
      DBMS_OUTPUT.PUT_LINE('Precio:' || precio);
      DBMS_OUTPUT.PUT_LINE('Tamaño Pantalla:' || tamanoPantalla);
      DBMS_OUTPUT.PUT_LINE('¿Es táctil?:' || esTactil);
      DBMS_OUTPUT.PUT_LINE('Funda:' || tieneFunda);
   END mostrarInfo;  
END;
/

CREATE TABLE tblPortatil2 OF Portatil;

 
by

PL/SQL Online Compiler

Write, Run & Share PL/SQL code online using OneCompiler's Oracle PL/SQL online editor and compiler for free. It's one of the robust, feature-rich online editor and compiler for Oracle PL/SQL running on latest version 23c (23.3.0.0). Getting started with the OneCompiler's Oracle PL/SQL editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'PL/SQL' and start writing code to learn and test online without worrying about tedious process of installation.

About PL/SQL

PL/SQL is procedural extension for SQL created by Oracle. It is by default embedded into the Oracle Database. PL/SQL program units are compiled and stored inside the Oracle Database which results in optimal execution times as the PL/SQL and SQL run within the same server process.

Syntax help

Following is the syntax structure for the PL/SQL code blocks

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)>
EXCEPTION 
   <exception handling> 
END;

Example

DECLARE 
   message  varchar2(100):= 'Hello, World!'; 
BEGIN 
   dbms_output.put_line(message); 
END; 
/

Named procedures

CREATE OR REPLACE FUNCTION 
hello_user
   (user_name IN VARCHAR2) 
    RETURN VARCHAR2
IS
BEGIN
   RETURN 'Hello ' || user_name;
END hello_user;
/

BEGIN
   dbms_output.put_line(hello_user('Peter'));
END;
/

Exception handling

BEGIN
  DBMS_OUTPUT.put_line (1/0);
EXCEPTION
  WHEN OTHERS
  THEN
    DBMS_OUTPUT.put_line ('error is: ' || SQLERRM);
END;