MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/md/admin/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/md/admin/sdonfemd.sql

Rem
Rem $Header: sdo/admin/sdonfemd.sql /main/11 2017/10/20 11:01:24 rjanders Exp $
Rem
Rem sdonfemd.sql
Rem
Rem Copyright (c) 2014, 2017, Oracle and/or its affiliates. 
Rem All rights reserved.
Rem
Rem    NAME
Rem      sdonfemd.sql - <one-line expansion of the name>
Rem
Rem    DESCRIPTION
Rem      <short description of component this file declares/defines>
Rem
Rem    NOTES
Rem      <other useful comments, qualifications, etc.>
Rem
Rem    BEGIN SQL_FILE_METADATA 
Rem    SQL_SOURCE_FILE: sdo/admin/sdonfemd.sql 
Rem    SQL_SHIPPED_FILE: md/admin/sdonfemd.sql 
Rem    SQL_PHASE: SDONFEMD
Rem    SQL_STARTUP_MODE: NORMAL 
Rem    SQL_IGNORABLE_ERRORS: NONE 
Rem    SQL_CALLING_FILE: sdo/admin/catmdsdop3.sql 
Rem    END SQL_FILE_METADATA
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem    rjanders    10/08/17 - Add MDSYS to spatial type
Rem    rjanders    06/30/17 - Add SYS/MDSYS prefixes
Rem    rjanders    05/10/17 - #26037683: Raise 'when other' exceptions
Rem    rjanders    04/13/17 - #25814260: Allow quoted bumpy-case usernames
Rem    rjanders    03/23/17 - #25437999: Remove 'when others then NULL'
Rem                           handlers
Rem    sravada     01/11/17 - bug 25370681
Rem    abmartin    02/25/16 - add select privilege to
Rem                           user_sdo_nfe_model_metadata view
Rem    czechar     08/14/15 - add SQL file metadata
Rem    sravada     07/24/15 - add exception handler
Rem    jcwang      07/22/15 - use grant read on all_sdo_nfe_xx views
Rem    abmartin    03/17/15 - Grant execute privilege to public for all types.
Rem    abmartin    01/07/15 - Remove the types dropping and move the trigger for dropping user to 
Rem                           the corresponding trigger for NDM Objects.
Rem    abmartin    10/27/14 - Created
Rem

@@?/rdbms/admin/sqlsessstart.sql

-- sdonfemd.sql

-- NFE Model Metadata main table
-- id               - Model identifier
-- name             - Model name
-- edition_mode     - Posible values: 1 - Features from scratch, 2 - Features over an existing network
-- versionable_ind  - Versionable model flag. Posible values: Y, N
-- table_reg_tab    - Table where the model's tables names are registered. Default name: TABLE_REGISTRY_[model_id]
-- sequence_reg_tab - Table where the model's tables sequences are registered. Default name: SEQUENCE_REGISTRY_[model_id]
-- network_name     - Name of the network related to the model. Reference to XXX_SDO_NETWORK_METADATA table.
DECLARE
  already_exists exception;
  pragma exception_init(already_exists, -00955);
BEGIN
  EXECUTE IMMEDIATE 
'CREATE TABLE MDSYS.SDO_NFE_MODEL_METADATA_TABLE (
  SDO_OWNER     varchar2(32) DEFAULT sys_context(''userenv'',''CURRENT_USER'') NOT NULL,
  ID                NUMBER NOT NULL PRIMARY KEY,
  NAME              VARCHAR2(24) NOT NULL,
  EDITION_MODE      NUMBER,
  VERSIONABLE_IND   CHAR(1),
  TABLE_REG_TAB     VARCHAR2(50),
  SEQUENCE_REG_TAB  VARCHAR2(50),
  NETWORK_NAME      VARCHAR2(50),
  CONSTRAINT unique_model_name UNIQUE (SDO_OWNER, NAME) )
';
  exception
    WHEN already_exists THEN NULL;
    WHEN others THEN
      SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                             'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')1]: ' || SQLERRM); RAISE;
END;
/

-- drop all the NFE Models views
DECLARE
  view_not_found exception;
  pragma exception_init(view_not_found, -00942);
BEGIN
  begin
    EXECUTE IMMEDIATE 'drop view mdsys.user_sdo_nfe_model_metadata';
    exception
      WHEN view_not_found THEN NULL;
      WHEN others THEN
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')2]: ' || SQLERRM); RAISE;
  end;

  begin
    EXECUTE IMMEDIATE 'drop view mdsys.all_sdo_nfe_model_metadata' ;
    exception
      WHEN view_not_found THEN NULL;
      WHEN others THEN
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')3]: ' || SQLERRM); RAISE;
  end;
END;
/

-- create model id sequence
DECLARE
  view_not_found exception;
  pragma exception_init(view_not_found, -00942);
  already_exists exception;
  pragma exception_init(already_exists, -00955);
BEGIN
  BEGIN
  EXECUTE IMMEDIATE 'CREATE SEQUENCE MDSYS.SDO_NFE_MODEL_ID_SEQ START WITH 1 INCREMENT BY 1 NOCACHE ';
  exception
    WHEN view_not_found THEN NULL;
    WHEN already_exists THEN NULL;
    WHEN others THEN
      SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                             'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')4]: ' || SQLERRM); RAISE;
  END;
END;
/

-- create user_sdo_nfe_model_metadata
CREATE OR REPLACE VIEW MDSYS.USER_SDO_NFE_MODEL_METADATA AS
  SELECT ID,
         NAME,
         EDITION_MODE,
         VERSIONABLE_IND,
         TABLE_REG_TAB,
         SEQUENCE_REG_TAB,
         NETWORK_NAME
  FROM MDSYS.SDO_NFE_MODEL_METADATA_TABLE
  WHERE SDO_OWNER = sys_context('userenv','CURRENT_USER');


CREATE OR REPLACE VIEW MDSYS.ALL_SDO_NFE_MODEL_METADATA AS
  SELECT SDO_OWNER OWNER,
         ID,
         NAME,
         EDITION_MODE,
         VERSIONABLE_IND,
         TABLE_REG_TAB,
         SEQUENCE_REG_TAB,
         NETWORK_NAME
  FROM MDSYS.SDO_NFE_MODEL_METADATA_TABLE;
  

-- grant priviledges to the views
GRANT SELECT, INSERT, DELETE, UPDATE ON MDSYS.USER_SDO_NFE_MODEL_METADATA TO PUBLIC;
GRANT READ ON MDSYS.ALL_SDO_NFE_MODEL_METADATA TO PUBLIC;

-- create public synynoms
CREATE OR REPLACE PUBLIC SYNONYM USER_SDO_NFE_MODEL_METADATA FOR MDSYS.USER_SDO_NFE_MODEL_METADATA;
CREATE OR REPLACE PUBLIC SYNONYM ALL_SDO_NFE_MODEL_METADATA FOR MDSYS.ALL_SDO_NFE_MODEL_METADATA;




-- Triggers for inserting, deleting and updating model metadata views

CREATE OR REPLACE TRIGGER MDSYS.SDO_NFE_MODEL_TRIG_INS
INSTEAD OF INSERT ON MDSYS.USER_SDO_NFE_MODEL_METADATA
REFERENCING NEW AS n
FOR EACH ROW 
DECLARE
  user_name     VARCHAR2(256);
  model_id      NUMBER;
  edition_mode  NUMBER := 1;
  versionable   VARCHAR2(1) := 'N';
  tabs_tab_name VARCHAR2(32) := 'TABLE_REGISTRY_';
  seqs_tab_name VARCHAR2(35) := 'SEQUENCE_REGISTRY_';
BEGIN
  EXECUTE IMMEDIATE 'SELECT user FROM SYS.DUAL' INTO user_name;
  -- find out the model ID from model ID sequence
  EXECUTE IMMEDIATE 'SELECT SDO_NFE_MODEL_ID_SEQ.nextval FROM SYS.DUAL' INTO model_id;
  
  -- Allow just two types of edition mode (1-From Scratch, 2-From Existing Network)
  IF ( edition_mode != :n.edition_mode ) THEN
    edition_mode := 2;
  END IF;
  
  IF ( :n.versionable_ind IS NOT NULL  AND  :n.versionable_ind = 'Y' ) THEN
    versionable := 'Y';
  END IF;
  
  IF ( :n.table_reg_tab IS NOT NULL ) THEN
    tabs_tab_name := :n.table_reg_tab;
  ELSE
    tabs_tab_name := tabs_tab_name || model_id;
  END IF;
  
  IF ( :n.sequence_reg_tab IS NOT NULL ) THEN
    seqs_tab_name := :n.sequence_reg_tab;
  ELSE
    seqs_tab_name := seqs_tab_name || model_id;
  END IF;
  
  -- insert model metadata and model id into SDO_NFE_MODEL_METADATA_TABLE
  INSERT INTO MDSYS.SDO_NFE_MODEL_METADATA_TABLE 
        (
         SDO_OWNER,
         ID,
         NAME,
         EDITION_MODE,
         VERSIONABLE_IND,
         TABLE_REG_TAB,
         SEQUENCE_REG_TAB,
         NETWORK_NAME
        )
        values
        (
          user_name,
          model_id,
          NLS_UPPER(:n.name),
          edition_mode,
          versionable,
          NLS_UPPER(tabs_tab_name),
          NLS_UPPER(seqs_tab_name),
          NLS_UPPER(:n.network_name)
        );
END;
/
show errors;


CREATE OR REPLACE TRIGGER MDSYS.SDO_NFE_MODEL_TRIG_DEL
INSTEAD OF DELETE ON MDSYS.USER_SDO_NFE_MODEL_METADATA
REFERENCING OLD AS o
FOR EACH ROW
DECLARE
  user_name    VARCHAR2(256);
BEGIN
  EXECUTE IMMEDIATE 'SELECT USER FROM SYS.DUAL' INTO user_name;
  DELETE FROM MDSYS.SDO_NFE_MODEL_METADATA_TABLE WHERE sdo_util.get_quoted_name(sdo_owner) = sdo_util.get_quoted_name(user_name) AND id = :o.id;
  
END;
/
show errors;


CREATE OR REPLACE TRIGGER MDSYS.SDO_NFE_MODEL_TRIG_UPD
INSTEAD OF UPDATE ON MDSYS.USER_SDO_NFE_MODEL_METADATA
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
DECLARE
  user_name     VARCHAR2(256);
  edition_mode  NUMBER := 1;
  versionable   VARCHAR2(1) := 'N';
BEGIN
  EXECUTE IMMEDIATE 'SELECT USER FROM SYS.DUAL' INTO user_name;
  
  IF ( edition_mode != :n.edition_mode ) THEN
    edition_mode := 2;
  END IF;
  
  IF ( :n.versionable_ind IS NOT NULL  AND  :n.versionable_ind = 'Y' ) THEN
    versionable := 'Y';
  END IF;
  
  UPDATE MDSYS.SDO_NFE_MODEL_METADATA_TABLE
    SET ( NAME,
          EDITION_MODE,
          VERSIONABLE_IND,
          TABLE_REG_TAB,
          SEQUENCE_REG_TAB,
          NETWORK_NAME  ) 
        =
        ( SELECT 
          NLS_UPPER(:n.name),
          edition_mode,
          versionable,
          NLS_UPPER(:n.table_reg_tab),
          NLS_UPPER(:n.sequence_reg_tab),
          NLS_UPPER(:n.network_name)
          FROM SYS.DUAL )
  WHERE  sdo_util.get_quoted_name(SDO_OWNER) = sdo_util.get_quoted_name(user_name)
     AND id = :o.id;
END;
/
show errors;


------------------------------------
-- SDO_NFE_MODEL_FTLAYER_REL
------------------------------------
-- model_id           Model identifier.
-- feature_layer_id   Feature layer identifier. Reference to XXX_SDO_NETWORK_FEATURE table.
-- hierarchy_level    Hierarchical level for the feature layer. By default it will be 0.
-- z_order            Order for the layer presentation. Lowest order is the first to be presented.
-- path_layer         Path feature layer indicator. Posible values: 'Y' - Is a path feature layer, 'N' or NULL - is a common feature layer.
DECLARE
  already_exists exception;
  pragma exception_init(already_exists, -00955);
BEGIN
  EXECUTE IMMEDIATE
    'CREATE TABLE MDSYS.SDO_NFE_MODEL_FTLAYER_REL(
        sdo_owner         VARCHAR2(32) 
                          DEFAULT SYS_CONTEXT(''USERENV'', ''CURRENT_USER'') NOT NULL,
        model_id          NUMBER NOT NULL REFERENCES MDSYS.SDO_NFE_MODEL_METADATA_TABLE(id),
        feature_layer_id  NUMBER NOT NULL,
        hierarchy_level   NUMBER NOT NULL,
        z_order           NUMBER,
        path_layer        VARCHAR2(1),
        CONSTRAINT nfe_ftlayer_rel_key PRIMARY KEY (model_id, feature_layer_id) )
    ';
  exception
    when already_exists then NULL;
    when others THEN
      SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                             'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')5]: ' || SQLERRM); RAISE;
END;
/
show errors;


-- drop views
DECLARE
  view_not_found exception;
  pragma exception_init(view_not_found, -00942);
BEGIN
  begin
    EXECUTE IMMEDIATE 'drop view mdsys.user_sdo_nfe_model_ftlayer_rel';
    exception
      WHEN view_not_found THEN NULL;
      WHEN others THEN
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                              'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')6]: ' || SQLERRM); RAISE;
  end;

  begin
    EXECUTE IMMEDIATE 'drop view MDSYS.all_sdo_nfe_model_ftlayer_rel' ;
    exception
      WHEN view_not_found THEN NULL;
      WHEN others THEN
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                              'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')7]: ' || SQLERRM); RAISE;
  end;
END;
/
show errors;


-- create views
CREATE OR REPLACE VIEW mdsys.user_sdo_nfe_model_ftlayer_rel AS
  SELECT model_id, feature_layer_id, hierarchy_level, z_order, path_layer
  FROM MDSYS.SDO_NFE_MODEL_FTLAYER_REL
  WHERE sdo_owner = sys_context('USERENV', 'CURRENT_USER');

CREATE OR REPLACE VIEW mdsys.all_sdo_nfe_model_ftlayer_rel AS
  SELECT sdo_owner owner, model_id, feature_layer_id, hierarchy_level, z_order, path_layer
  FROM MDSYS.SDO_NFE_MODEL_FTLAYER_REL;


-- granting view privileges
GRANT SELECT, INSERT, DELETE, UPDATE ON mdsys.user_sdo_nfe_model_ftlayer_rel TO PUBLIC;
GRANT READ ON MDSYS.all_sdo_nfe_model_ftlayer_rel TO PUBLIC;

-- create public synynoms
CREATE OR REPLACE PUBLIC SYNONYM user_sdo_nfe_model_ftlayer_rel FOR MDSYS.user_sdo_nfe_model_ftlayer_rel;
CREATE OR REPLACE PUBLIC SYNONYM all_sdo_nfe_model_ftlayer_rel FOR MDSYS.all_sdo_nfe_model_ftlayer_rel;



-- Triggers for inserting, deleting and updating
CREATE OR REPLACE TRIGGER MDSYS.sdo_model_ftlayer_trig_ins
INSTEAD OF INSERT ON mdsys.user_sdo_nfe_model_ftlayer_rel
REFERENCING NEW AS n
FOR EACH ROW
DECLARE
  user_name VARCHAR2(256);
  path_layer VARCHAR2(1) := 'Y';
BEGIN
  EXECUTE IMMEDIATE 'SELECT user FROM SYS.DUAL' INTO user_name;
  
  IF ( :n.path_layer IS NULL OR :n.path_layer != 'Y' ) THEN
    path_layer := 'N';
  END IF;
  
  INSERT INTO MDSYS.SDO_NFE_MODEL_FTLAYER_REL 
        (
         SDO_OWNER,
         MODEL_ID,
         feature_layer_id,
         hierarchy_level,
         z_order,
         path_layer
        )
        values
        (
          user_name,
          :n.model_id,
          :n.feature_layer_id,
          :n.hierarchy_level,
          :n.z_order,
          path_layer
        );
END;
/
show errors;


CREATE OR REPLACE TRIGGER MDSYS.sdo_model_ftlayer_trig_del
INSTEAD OF DELETE on mdsys.user_sdo_nfe_model_ftlayer_rel
REFERENCING OLD AS o
DECLARE
  user_name   VARCHAR2(256);
BEGIN
  EXECUTE IMMEDIATE 'SELECT user FROM SYS.DUAL' INTO user_name;
  
  DELETE FROM MDSYS.SDO_NFE_MODEL_FTLAYER_REL 
  WHERE sdo_util.get_quoted_name(sdo_owner) = sdo_util.get_quoted_name(user_name) 
    AND model_id = :o.model_id AND feature_layer_id = :o.feature_layer_id;
END;
/
show errors;


CREATE OR REPLACE TRIGGER MDSYS.sdo_model_ftlayer_trig_upd
INSTEAD OF UPDATE ON mdsys.user_sdo_nfe_model_ftlayer_rel
REFERENCING NEW AS n OLD AS o
DECLARE
  user_name   VARCHAR2(256);
  path_layer VARCHAR2(1) := 'Y';
BEGIN
  EXECUTE IMMEDIATE 'SELECT user FROM SYS.DUAL' INTO user_name;
  
  IF ( :n.path_layer IS NULL OR :n.path_layer != 'Y' ) THEN
    path_layer := 'N';
  END IF;
  
  UPDATE MDSYS.SDO_NFE_MODEL_FTLAYER_REL
    SET ( HIERARCHY_LEVEL,
          Z_ORDER,
          PATH_LAYER  ) 
        =
        ( SELECT 
          :n.hierarchy_level,
          :n.z_order,
          path_layer
          FROM SYS.DUAL )
  WHERE  sdo_util.get_quoted_name(SDO_OWNER) = sdo_util.get_quoted_name(user_name)
     AND model_id = :o.model_id AND feature_layer_id = :o.feature_layer_id;
END;
/
show errors;


------------------------------------
-- SDO_NFE_MODEL_WORKSPACE
------------------------------------
-- id         Workspace identifier.
-- model_id   Model identifier.
-- workspace  Workspace name.
-- mbr_ind    Indicates whether the workspace represents an MBR region or not. Posible values: Y, N
-- lower_X    X for the lower coordinate of the MBR.
-- upper_X    X for the upper coordinate of the MBR.
-- lower_Y    Y for the lower coordinate of the MBR.
-- upper_Y    Y for the upper coordinate of the MBR.
-- lock_ind   Indicates whether the workspace is locked to be edited for others or not. Posible values: Y, N
DECLARE
  already_exists exception;
  pragma exception_init(already_exists, -00955);
BEGIN
  EXECUTE IMMEDIATE
    'CREATE TABLE MDSYS.SDO_NFE_MODEL_WORKSPACE (
        sdo_owner         VARCHAR2(32) 
                          DEFAULT SYS_CONTEXT(''USERENV'', ''CURRENT_USER'') NOT NULL,
        id                NUMBER PRIMARY KEY,
        model_id          NUMBER NOT NULL,
        workspace         VARCHAR2(50),
        mbr_ind           CHAR(1),
        lower_x           NUMBER,
        upper_x           NUMBER,
        lower_y           NUMBER,
        upper_y           NUMBER,
        lock_ind          CHAR(1) )
    ';
  exception
    when already_exists then NULL;
    when others THEN
      SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                             'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')8]: ' || SQLERRM); RAISE;
END;
/
show errors;


-- drop all the NFE Models views
DECLARE
  view_not_found exception;
  pragma exception_init(view_not_found, -00942);
BEGIN
  begin
    EXECUTE IMMEDIATE 'drop view mdsys.user_sdo_nfe_model_workspace';
    exception
      WHEN view_not_found THEN NULL;
      WHEN others THEN
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')9]: ' || SQLERRM); RAISE;
  end;

  begin
    EXECUTE IMMEDIATE 'drop view mdsys.all_sdo_nfe_model_workspace' ;
    exception
      WHEN view_not_found THEN NULL;
      WHEN others THEN
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')10]: ' || SQLERRM); RAISE;
  end;
END;
/
show errors;


-- create workspace id sequence
DECLARE
  already_exists exception;
  pragma exception_init(already_exists, -00955);
BEGIN
  BEGIN
  EXECUTE IMMEDIATE 'CREATE SEQUENCE MDSYS.SDO_NFE_WORKSPACE_ID_SEQ START WITH 1 INCREMENT BY 1 NOCACHE ';
  exception
    when already_exists then NULL;
    when others THEN
      SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                             'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')11]: ' || SQLERRM); RAISE;
  END;
END;
/
show errors;


-- create view mdsys.user_sdo_nfe_model_metadata
CREATE OR REPLACE VIEW MDSYS.USER_SDO_NFE_MODEL_WORKSPACE AS
  SELECT id,
         model_id,
         workspace,
         mbr_ind,
         lower_x,
         upper_x,
         lower_y,
         upper_y,
         lock_ind
  FROM MDSYS.SDO_NFE_MODEL_WORKSPACE
  WHERE SDO_OWNER = sys_context('userenv','CURRENT_USER');

-- create view mdsys.all_sdo_nfe_model_metadata
CREATE OR REPLACE VIEW MDSYS.ALL_SDO_NFE_MODEL_WORKSPACE AS
  SELECT SDO_OWNER OWNER,
         id,
         model_id,
         workspace,
         mbr_ind,
         lower_x,
         upper_x,
         lower_y,
         upper_y,
         lock_ind
  FROM MDSYS.SDO_NFE_MODEL_WORKSPACE;
  

-- grant priviledges to the views
GRANT SELECT, INSERT, DELETE, UPDATE ON MDSYS.USER_SDO_NFE_MODEL_WORKSPACE TO PUBLIC;
GRANT READ  ON MDSYS.ALL_SDO_NFE_MODEL_WORKSPACE TO PUBLIC;

-- create public synynoms
CREATE OR REPLACE PUBLIC SYNONYM USER_SDO_NFE_MODEL_WORKSPACE FOR MDSYS.USER_SDO_NFE_MODEL_WORKSPACE;
CREATE OR REPLACE PUBLIC SYNONYM ALL_SDO_NFE_MODEL_WORKSPACE FOR MDSYS.ALL_SDO_NFE_MODEL_WORKSPACE;


-- Triggers for inserting, deleting and updating model workspace metadata views
CREATE OR REPLACE TRIGGER MDSYS.SDO_NFE_WORKSPACE_TRIG_INS
INSTEAD OF INSERT ON MDSYS.USER_SDO_NFE_MODEL_WORKSPACE
REFERENCING NEW AS n
FOR EACH ROW
DECLARE
  user_name   VARCHAR2(256);
  ws_id       NUMBER;
  mbr_ind     CHAR(1) := 'Y';
  lock_ind    CHAR(1) := 'Y';
BEGIN
  EXECUTE IMMEDIATE 'SELECT user FROM SYS.DUAL' INTO user_name;
  -- find out the workspace ID from WS ID sequence
  EXECUTE IMMEDIATE 'SELECT SDO_NFE_WORKSPACE_ID_SEQ.nextval FROM SYS.DUAL' INTO ws_id;
  
  IF ( :n.mbr_ind IS NULL OR 'Y' != NLS_UPPER(:n.mbr_ind) ) THEN
    mbr_ind := 'N';
  END IF;
  
  IF ( :n.lock_ind IS NULL OR 'Y' != NLS_UPPER(:n.lock_ind) ) THEN
    lock_ind := 'N';
  END IF;
  
  INSERT INTO MDSYS.SDO_NFE_MODEL_WORKSPACE
        (
         SDO_OWNER,
         id,
         model_id,
         workspace,
         mbr_ind,
         lower_x,
         upper_x,
         lower_y,
         upper_y,
         lock_ind
        )
  VALUES
        (
         sdo_util.get_quoted_name(user_name),
         ws_id,
         :n.model_id,
         NLS_UPPER(:n.workspace),
         mbr_ind,
         :n.lower_x,
         :n.upper_x,
         :n.lower_y,
         :n.upper_y,
         lock_ind
        );
END;
/
SHOW ERRORS;


CREATE OR REPLACE TRIGGER MDSYS.SDO_NFE_WORKSPACE_TRIG_DEL
INSTEAD OF DELETE ON MDSYS.USER_SDO_NFE_MODEL_WORKSPACE
REFERENCING OLD AS o
FOR EACH ROW
DECLARE
  user_name   VARCHAR2(256);
BEGIN
  EXECUTE IMMEDIATE 'SELECT user FROM SYS.DUAL' INTO user_name;
  
  DELETE FROM MDSYS.SDO_NFE_MODEL_WORKSPACE WHERE sdo_util.get_quoted_name(SDO_OWNER) = sdo_util.get_quoted_name(user_name) AND id = :o.id;
  
END;
/
SHOW ERRORS;


CREATE OR REPLACE TRIGGER MDSYS.SDO_NFE_WORKSPACE_TRIG_UPD
INSTEAD OF UPDATE ON MDSYS.USER_SDO_NFE_MODEL_WORKSPACE
REFERENCING NEW AS n OLD AS o
FOR EACH ROW
DECLARE
  user_name   VARCHAR2(256);
  mbr_ind     CHAR(1) := 'Y';
  lock_ind    CHAR(1) := 'Y';
BEGIN
  EXECUTE IMMEDIATE 'SELECT user FROM SYS.DUAL' INTO user_name;
  
  IF ( :n.mbr_ind IS NULL OR 'Y' != NLS_UPPER(:n.mbr_ind) ) THEN
    mbr_ind := 'N';
  END IF;
  
  IF ( :n.lock_ind IS NULL OR 'Y' != NLS_UPPER(:n.lock_ind) ) THEN
    lock_ind := 'N';
  END IF;
  
  UPDATE MDSYS.SDO_NFE_MODEL_WORKSPACE
    SET (
         model_id,
         workspace,
         mbr_ind,
         lower_x,
         upper_x,
         lower_y,
         upper_y,
         lock_ind
        ) =
        ( SELECT
         :n.model_id,
         NLS_UPPER(:n.workspace),
         mbr_ind,
         :n.lower_x,
         :n.upper_x,
         :n.lower_y,
         :n.upper_y,
         lock_ind
         FROM SYS.DUAL)
  WHERE  sdo_util.get_quoted_name(sdo_owner) = sdo_util.get_quoted_name(user_name)
     AND id = :o.id;
END;
/
SHOW ERRORS;


--------------------------------------
-- TYPES
-- Create types for internal process
--------------------------------------

---- Remove previous definitions
--BEGIN
--  EXECUTE IMMEDIATE 'DROP TYPE MDSYS.SDO_INTERACTION_ARRAY FORCE';
--  EXECUTE IMMEDIATE 'DROP TYPE MDSYS.SDO_INTERACTION FORCE';
--  EXECUTE IMMEDIATE 'DROP TYPE MDSYS.SDO_INTERACT_LINE_FEAT_ARRAY FORCE';
--  EXECUTE IMMEDIATE 'DROP TYPE MDSYS.SDO_INTERACT_POINT_FEAT_ARRAY FORCE';
--  EXECUTE IMMEDIATE 'DROP TYPE MDSYS.SDO_INTERACT_LINE_FEAT FORCE';
--  EXECUTE IMMEDIATE 'DROP TYPE MDSYS.SDO_INTERACT_POINT_FEAT FORCE';
--  exception WHEN others THEN NULL;
--END;
--/

--------------------------------------------------------------------------------
-- Type SDO_INTERACT_POINT_FEAT
-- Description:
--    This type represents a POINT Feature that is interacting
--    with any other feature in a particular NFE Model.
-- Members:
--    feature_layer_id    Feature Layer identifier
--    feature_id          Feature identifier
--    feature_class_id    Feature class identifier
--    node_id             Underlying node id
--    node_geom           Underlying node geometry
--    available_in_conn   Array set of Numbers, keeps the available INCOMING connections to the point grouped by line-point Rule ID, in the form (rule_id, av_in_conn)
--    available_out_conn  Array set of Numbers, keeps the available OUTGOING connections to the point grouped by line-point Rule ID, in the form (rule_id, av_out_conn)
--    runtime_created     Indicator to know whether the point was created in runtime or it already existed before. Posible values: Y, N.
--------------------------------------------------------------------------------
DECLARE
  dependent_objects exception;
  pragma exception_init(dependent_objects, -02303);
BEGIN
  BEGIN
    EXECUTE IMMEDIATE
      'CREATE OR REPLACE TYPE MDSYS.SDO_INTERACT_POINT_FEAT AS OBJECT (
        feature_layer_id   NUMBER, 
        feature_id         NUMBER, 
        feature_class_id   NUMBER,
        node_id            NUMBER, 
        node_geom          MDSYS.SDO_GEOMETRY,
        available_in_conn  MDSYS.SDO_NUMBER_ARRAYSET,
        available_out_conn MDSYS.SDO_NUMBER_ARRAYSET,
        runtime_created CHAR(1),
        MAP MEMBER FUNCTION get_id RETURN VARCHAR2
        )';
    exception
      when dependent_objects then NULL;
      when others then
      SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                             'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')12]: ' || SQLERRM); RAISE;
  END;
END;
/
show errors;


CREATE OR REPLACE TYPE BODY MDSYS.SDO_INTERACT_POINT_FEAT AS
  MAP MEMBER FUNCTION get_id RETURN VARCHAR2 IS
  BEGIN
    return feature_layer_id || ''-'' || feature_id || ''-'' || node_id;
  END;
END;
/
show errors;

grant execute on mdsys.SDO_INTERACT_POINT_FEAT to public;
create or replace public synonym SDO_INTERACT_POINT_FEAT for mdsys.SDO_INTERACT_POINT_FEAT;

DECLARE
  dependent_objects exception;
  pragma exception_init(dependent_objects, -02303);
BEGIN
  BEGIN
    -- Type array to store multiple interacting POINT features.
    EXECUTE IMMEDIATE
      'CREATE OR REPLACE TYPE MDSYS.SDO_INTERACT_POINT_FEAT_ARRAY IS VARRAY(1048576) OF MDSYS.SDO_INTERACT_POINT_FEAT';
    exception
      when dependent_objects THEN NULL;
      when others then
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')13]: ' || SQLERRM); RAISE;
  END;
END;
/
SHOW ERRORS;

grant execute on mdsys.SDO_INTERACT_POINT_FEAT_ARRAY to public;
create or replace public synonym SDO_INTERACT_POINT_FEAT_ARRAY for mdsys.SDO_INTERACT_POINT_FEAT_ARRAY;


-----------------------------------------------------------------------------------------
-- Type SDO_INTERACT_LINE_FEAT
-- Description:
--    This type represents a LINE Feature that is interacting
--    with any other feature in a particular NFE Model.
-- Members:
--    feature_layer_id    Feature Layer identifier
--    feature_id          Feature identifier
--    feature_class_id    Feature class identifier
--    link_id             Underlying link id
--    link_geom           Underlying link geometry
--    start_node          Interacting point working as start node
--    end_node            Interacting point working as end node
--    bidirected          Underlying link bidirected indicator. Possible values: Y|N
--    intersection_location Possible values: sdo_net.INTERSECT_LOC_FIRST_PT, 
--                        sdo_net.INTERSECT_LOC_LAST_PT, sdo_net.INTERSECT_LOC_MID_PT
--    rule_side           Indicates if the interacting line falls in the left or right 
--                        hand side of the rule. 
--                        Possible values: LL_RULE_LHS, LL_RULE_RHS
------------------------------------------------------------------------------------------
DECLARE
  dependent_objects exception;
  pragma exception_init(dependent_objects, -02303);
BEGIN
  BEGIN
    EXECUTE IMMEDIATE
      'CREATE OR REPLACE TYPE MDSYS.SDO_INTERACT_LINE_FEAT AS OBJECT (
        feature_layer_id  NUMBER, 
        feature_id        NUMBER, 
        feature_class_id  NUMBER,
        link_id           NUMBER, 
        link_geom         MDSYS.SDO_GEOMETRY, 
        start_node        MDSYS.SDO_INTERACT_POINT_FEAT,
        end_node          MDSYS.SDO_INTERACT_POINT_FEAT,
        bidirected        CHAR(1),
        intersection_location NUMBER,
        rule_side         CHAR(1),
        MAP MEMBER FUNCTION get_id RETURN VARCHAR2
       )';
    exception
      when dependent_objects then NULL;
      when others then
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')14]: ' || SQLERRM); RAISE;
  END;
END;
/
show errors;


CREATE OR REPLACE TYPE BODY MDSYS.SDO_INTERACT_LINE_FEAT AS
  MAP MEMBER FUNCTION get_id RETURN VARCHAR2 IS
  BEGIN
    return feature_layer_id || ''-'' || feature_id || ''-'' || link_id;
  END;
END;
/
show errors;

grant execute on mdsys.SDO_INTERACT_LINE_FEAT to public;
create or replace public synonym SDO_INTERACT_LINE_FEAT for mdsys.SDO_INTERACT_LINE_FEAT;

DECLARE
  dependent_objects exception;
  pragma exception_init(dependent_objects, -02303);
BEGIN
  BEGIN
    -- Type array to store multiple interacting LINE features.
    EXECUTE IMMEDIATE 
      'CREATE OR REPLACE TYPE MDSYS.SDO_INTERACT_LINE_FEAT_ARRAY IS VARRAY(1048576) OF MDSYS.SDO_INTERACT_LINE_FEAT';
    exception
      when dependent_objects then NULL;
      when others then
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')15]: ' || SQLERRM); RAISE;
  END;
END;
/
SHOW ERRORS;

grant execute on mdsys.SDO_INTERACT_LINE_FEAT_ARRAY to public;
create or replace public synonym SDO_INTERACT_LINE_FEAT_ARRAY for mdsys.SDO_INTERACT_LINE_FEAT_ARRAY;


-----------------------------------------------------------------------------------------------
-- Type SDO_INTERACTION
-- Description:
--    This type represents a group a features that are interacting in a single spatial point.
-- Members:
--    lines               Array of Interacting LINE Features
--    points              Array of Interacting POINT Features
--    intersect_pt_geom   Geometry of the spatial point where all the features are interacting.
------------------------------------------------------------------------------------------------
DECLARE
  dependent_objects exception;
  pragma exception_init(dependent_objects, -02303);
BEGIN
  BEGIN
    EXECUTE IMMEDIATE
      'CREATE OR REPLACE TYPE MDSYS.SDO_INTERACTION AS OBJECT ( 
        lines             MDSYS.SDO_INTERACT_LINE_FEAT_ARRAY,
        points            MDSYS.SDO_INTERACT_POINT_FEAT_ARRAY,
        intersect_pt_geom MDSYS.SDO_GEOMETRY
       )';
    exception
      when dependent_objects then NULL;
      when others then
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')16]: ' || SQLERRM); RAISE;
  END;
END;
/
show errors;

grant execute on mdsys.SDO_INTERACTION to public;
create or replace public synonym SDO_INTERACTION for mdsys.SDO_INTERACTION;

DECLARE
BEGIN
  BEGIN  
    -- Type array to store multiple interaction groups.
    EXECUTE IMMEDIATE 
      'CREATE OR REPLACE TYPE MDSYS.SDO_INTERACTION_ARRAY IS VARRAY (1048576) OF MDSYS.SDO_INTERACTION';
    exception
      when others then
        SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
                               'EXCEPTION[sdonfemd.sql(' || $$PLSQL_LINE || ')17]: ' || SQLERRM); RAISE;
  END;
END;
/
SHOW ERRORS;

grant execute on mdsys.SDO_INTERACTION_ARRAY to public;
create or replace public synonym SDO_INTERACTION_ARRAY for mdsys.SDO_INTERACTION_ARRAY;

@?/rdbms/admin/sqlsessend.sql


OHA YOOOO