MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/rdbms/admin/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/rdbms/admin/xdbuuc4.sql

Rem
Rem $Header: rdbms/admin/xdbuuc4.sql /main/6 2017/05/28 22:45:58 stanaya Exp $
Rem
Rem xdbuuc.sql
Rem
Rem Copyright (c) 2004, 2017, Oracle and/or its affiliates. 
Rem All rights reserved.
Rem
Rem    NAME
Rem      xdbuuc4.sql - XDB upgrade utility functions. This is the same
Rem      as xdbuuc.sql, except that we now have 10 nulls in the
Rem      definition of insertElement.
Rem
Rem    DESCRIPTION
Rem      Functions useful during XDB upgrade. Culled from various files
Rem
Rem    NOTES
Rem      <other useful comments, qualifications, etc.>
Rem
Rem    BEGIN SQL_FILE_METADATA
Rem    SQL_SOURCE_FILE: rdbms/admin/xdbuuc4.sql
Rem    SQL_SHIPPED_FILE: rdbms/admin/xdbuuc4.sql
Rem    SQL_PHASE: UPGRADE
Rem    SQL_STARTUP_MODE: UPGRADE
Rem    SQL_IGNORABLE_ERRORS: NONE
Rem    END SQL_FILE_METADATA
Rem    
Rem    MODIFIED   (MM/DD/YY)
Rem    badeoti     04/19/10 - Bug 9591348
Rem    badeoti     07/23/09 - compile any_t
Rem    sanagara    12/01/08 - 7284151: compile types
Rem    yifeng      11/12/07 - create element_exists_complextype
Rem    smalde      01/30/04 - Created

--
-- The following type compilations are necessary due to the fix
-- for bug 7284151. These types are directly depended on by tables
-- referenced in the pl/sql code that follows below. Due to changes
-- introduced by the fix for bug 7284151, the pl/sql code may get
-- ORA-942 errors and fail to compile if these types are invalid
-- (which they are likely to be at this stage of the upgrade)
--
alter type XDB.XDB$SCHEMA_T compile;
alter type XDB.XDB$ELEMENT_T compile;
alter type XDB.XDB$SIMPLE_T compile;
alter type XDB.XDB$COMPLEX_T compile;
alter type XDB.XDB$ANY_T compile;

-- UTILITY FUNCTIONS FOR UPGRADE
create or replace procedure element_type(schema_url IN varchar2, element_name IN
    varchar2, type_owner out varchar2, type_name out varchar2) as
qry varchar2(4000);
cur integer;
rc integer;
begin
  qry   := 
    'select e.xmldata.property.sqlschema, e.xmldata.property.sqltype ' ||
    'from xdb.xdb$element e, xdb.xdb$schema s '                        ||
    'where e.xmldata.property.name = :a ' || 
    'and e.xmldata.property.parent_schema = ref(s) '              ||
    'and s.xmldata.schema_url = :b';

  cur := dbms_sql.open_cursor;
  dbms_sql.parse(cur, qry, dbms_sql.native);
  dbms_sql.bind_variable(cur, ':a', element_name);
  dbms_sql.bind_variable(cur, ':b', schema_url);
  dbms_sql.define_column(cur, 1, type_owner, 30);
  dbms_sql.define_column(cur, 2, type_name, 30);
  rc := dbms_sql.execute(cur);
  IF dbms_sql.fetch_rows(cur) > 0 THEN
    dbms_sql.column_value(cur, 1, type_owner);
    dbms_sql.column_value(cur, 2, type_name);
  ELSE
    dbms_sql.close_cursor(cur);
    dbms_output.put_line('XDBNB: no element type, url=' || schema_url ||
        ', elem=' || element_name);
    RETURN;
  END IF;
  dbms_sql.close_cursor(cur);

END;
/

show errors;

CREATE OR REPLACE PROCEDURE ALT_TYPE_DROP_ATTRIBUTE(type_owner   IN varchar2,
                                                    type_name    IN varchar2,
                                                    attr_string  IN varchar2) as
  sqlstr varchar2(1000);
BEGIN
  sqlstr := 'ALTER TYPE ' || 
            dbms_assert.enquote_name(type_owner, false) || '.' || 
            dbms_assert.enquote_name(type_name, false) ||
            ' DROP ATTRIBUTE (' || attr_string || ') CASCADE';
  EXECUTE IMMEDIATE sqlstr;
END;
/

show errors;

CREATE OR REPLACE PROCEDURE alt_type_add_attribute(type_owner  IN varchar2,
                                                   type_name   IN varchar2, 
                                                   attr_string IN varchar2) as
  cur integer;
  rc  integer;
BEGIN
  cur := dbms_sql.open_cursor;
  dbms_sql.parse(
    cur,
    'ALTER TYPE ' || 
    dbms_assert.enquote_name(type_owner, false) || '.' || 
    dbms_assert.enquote_name(type_name, false) ||
    ' ADD ATTRIBUTE (' || attr_string || ') CASCADE',
    dbms_sql.native);
  rc := dbms_sql.execute(cur);
  dbms_sql.close_cursor(cur);
END;
/

show errors;

create or replace function get_upgrade_status return integer as
m integer;
begin
  select n into m from xdb.migr9202status;
  return m;
end;
/

show errors;

create or replace procedure set_upgrade_status(m integer, docommit boolean) as
begin
  update xdb.migr9202status set n = m;
  if docommit then
    commit;
  end if;
end;
/

show errors;

-- Rem Function to insert new bootstrap schema elements
-- create or replace function xdb.xdb$insertElement(
--                 parent_schema   ref sys.xmltype,
--                 prop_number     integer,
--                 name            varchar2,
--                 typename        xdb.xdb$qname,
--                 min_occurs      integer,
--                 max_occurs      integer,
--                 mem_byte_length raw,
--                 mem_type_code   raw,
--                 system          raw,
--                 mutable         raw,
--                 fixed           raw,
--                 sqlname         varchar2,
--                 sqltype         varchar2,
--                 sqlschema       varchar2,
--                 java_type       xdb.xdb$javatype,
--                 default_value   varchar2,
--                 smpl_type_decl  ref sys.xmltype,
--                 type_ref        ref sys.xmltype,
--                 propref_name    xdb.xdb$qname,
--                 propref_ref     ref sys.xmltype,
--                 subs_group      xdb.xdb$qname,
--                 num_cols        integer,
--                 nillable        raw,
--                 final_info      xdb.xdb$derivationChoice,
--                 block           xdb.xdb$derivationChoice,
--                 abstract        raw,
--                 mem_inline      raw,
--                 sql_inline      raw,
--                 java_inline     raw,
--                 maintain_dom    raw,
--                 default_table   varchar2,
--                 table_storage   varchar2,
--                 java_classname  varchar2,
--                 bean_classname  varchar2,
--                 global          raw,
--                 base_sqlname    varchar2,
--                 cplx_type_decl  ref sys.xmltype,
--                 subs_group_refs xdb.xdb$xmltype_ref_list_t,
--                 sqlcolltype     varchar2 := null,
--                 sqlcollschema   varchar2 := null,
--                 hidden          raw := null,
--                 transient       xdb.xdb$transientChoice := null,
--                 baseprop        raw := null
--         ) return ref sys.xmltype is
--                 elem_i xdb.xdb$element_t;
--                 elem_ref ref sys.xmltype;
--         begin
--                 elem_i := xdb.xdb$element_t(
--                             xdb.xdb$property_t(null,parent_schema,prop_number,
--                                   name,typename,
--                                   mem_byte_length,mem_type_code,system,
--                                   mutable,null,
--                                   sqlname,sqltype,sqlschema,java_type,
--                                   default_value,smpl_type_decl,type_ref,
--                                   propref_name,propref_ref,
--                                   null, null, global,null,
--                                   sqlcolltype, sqlcollschema,
--                                   hidden, transient, null, baseprop),
--                                 subs_group,num_cols,nillable,
--                                 final_info,block,abstract,
--                                 mem_inline,sql_inline,java_inline,
--                                 maintain_dom,default_table,'XDB',
--                                 table_storage,java_classname,bean_classname,
--                                 base_sqlname,cplx_type_decl,
--                                 subs_group_refs, null,
--                                 min_occurs,to_char(max_occurs),
--                                 null,null,null,null,null,null,null,null,null,null);

--   execute immediate 'insert into xdb.xdb$element e (xmldata) 
--   values (:1) returning ref(e) into :2' using elem_i returning into elem_ref;

--                 return elem_ref;
--         end;
-- /

-- This procedure executes the statement given by stmt only if the
-- current value of the migr9202status is GREATER than the given
-- value. It then updates the status and commits everything atomically
-- The statement CAN be a ddl.
CREATE OR REPLACE PROCEDURE exec_stmt_chg_status(status IN number,
                                                 stmt IN varchar2) as
  m integer;
BEGIN
  select n into m from xdb.migr9202status;
  IF m > status THEN
    update xdb.migr9202status set n  = status;
    execute immediate stmt;
    commit;
  END IF;
END;
/

show errors;

-- same function as above except it deletes the schema instead of
-- executing a statement.
CREATE OR REPLACE PROCEDURE drop_schema_chg_status(status IN number,
                                                   schurl IN varchar2) as
  m integer;
BEGIN
  select n into m from xdb.migr9202status;
  IF m > status THEN
    update xdb.migr9202status set n  = status;
    select count(*) into m from xdb.xdb$schema s where
         s.xmldata.schema_url = schurl;
    IF m > 0 THEN
      dbms_xmlschema.deleteschema(schurl, dbms_xmlschema.delete_cascade);
    END IF;
    commit;
  END IF;
END;
/

show errors;

CREATE OR REPLACE PROCEDURE DELETE_ELEM_BY_REF (eltref ref xmltype,
                                                delete_cascade boolean
                                                  default false) as
  type_name  VARCHAR2(30);
  type_ref   REF XMLTYPE;
  seq_ref    REF XMLTYPE;
  elem_arr   XDB.XDB$XMLTYPE_REF_LIST_T;
BEGIN

  delete from xdb.xdb$element e where ref(e) = eltref
    returning e.xmldata.property.sqltype, e.xmldata.property.type_ref
         into type_name, type_ref;

  IF delete_cascade THEN

    IF type_ref IS NOT NULL THEN
      IF type_name = 'XDB$ENUM_T' THEN
        delete from xdb.xdb$simple_type s where ref(s) = type_ref;
      ELSE
        delete from xdb.xdb$complex_type c where ref(c) = type_ref
          returning c.xmldata.sequence_kid into seq_ref;

        IF seq_ref IS NOT NULL THEN
          delete from xdb.xdb$sequence_model m where ref(m) = seq_ref
            returning m.xmldata.elements into elem_arr;
          FOR i IN 1..elem_arr.last LOOP
            delete_elem_by_ref(elem_arr(i), true);
          END LOOP;
        END IF;
      END IF;
    END IF;
  END IF;

END;
/

show errors;

-- Find child element in a sequence by name
create or replace function find_child(seq   xdb.xdb$xmltype_ref_list_t,
                                      child varchar2) return ref xmltype
as
  r  ref xmltype;
begin
  select ref(e) into r from xdb.xdb$element e
   where ref(e) in (select * from table(seq)) and
         e.xmldata.property.name = child;
  return r;
exception
  when no_data_found then
    return null;
end;
/

show errors;

create or replace function find_child_with_model(parent         ref xmltype,
                                                 child          varchar2,
                                                 model      out ref xmltype,
                                                 model_type out varchar2)
  return ref xmltype
as
  r        ref xmltype;
  elems    xdb.xdb$xmltype_ref_list_t; -- child elements
  choices  xdb.xdb$xmltype_ref_list_t; -- choice elements
begin

  -- Find child element under parent's elements and choices
  select ref(m), m.xmldata.elements, m.xmldata.choice_kids
    into model, elems, choices
    from xdb.xdb$element e, xdb.xdb$complex_type c, xdb.xdb$sequence_model m
   where ref(e) = parent and
         ref(c) in (e.xmldata.cplx_type_decl,
                    e.xmldata.property.type_ref) and
         ref(m) = c.xmldata.sequence_kid;
  r := find_child(elems, child);
  if r is not null then
    model_type := 'xdb$sequence_model';
    return r;
  end if;

  if choices is not null then
    for i in 1..choices.count loop
      select ref(m), m.xmldata.elements
        into model, elems
        from xdb.xdb$choice_model m
       where ref(m) = choices(i);
      r := find_child(elems, child);
      if r is not null then
        model_type := 'xdb$choice_model';
        return r;
      end if; 
    end loop;
  end if;

  return null;
end;
/

show errors;

-- Find child element under a parent element
create or replace function find_element(schema_url  varchar2,
                                        xpath       varchar2,
                                        parent      ref xmltype default null)
  return ref xmltype
as

  r          ref xmltype;
  elems      xdb.xdb$xmltype_ref_list_t; -- child elements
  sep        pls_integer;                -- '/' separator
  child      varchar2(80);               -- child element name
  model      ref xmltype;
  model_type varchar2(80);

begin

  -- Find child name
  sep := instr(xpath, '/', 2);
  if (sep > 2) then
    child := substr(xpath, 2, sep-2);
  else
    child := substr(xpath, 2);
  end if;

  if parent is null then
    -- Find root element
    select s.xmldata.elements into elems
      from xdb.xdb$schema s where s.xmldata.schema_url = schema_url;
    r := find_child(elems, child);
  else
    -- Find child element under parent's elements and choices
    r := find_child_with_model(parent, child, model, model_type);
  end if;

  -- Keep traversing the xpath if this is not the leaf child
  if (sep > 2) then
    return find_element(null, substr(xpath, sep), r);
  end if;
  return r;
end;
/

show errors;

-- Generate type name with a sequence number
create or replace function type_name(prefix varchar2, suffix varchar2)
  return varchar2
as
  name varchar2(80);
begin
  select prefix || xdb.xdb$namesuff_seq.nextval || '_' || suffix
    into name from dual;
  return name;
end;
/

show errors;

create or replace function element_exists_complextype(schema_url IN varchar2, complex_type IN varchar2, ell_name IN varchar2) return boolean
as
  seq_ref         REF XMLTYPE;
  elem_list         XDB.XDB$XMLTYPE_REF_LIST_T;
  rescfg_schema_ref  REF XMLTYPE;
  v_idx NUMBER;
  ename varchar2(2000);
begin

--  following comments are assuming to find some element in the 
--  'http://xmlns.oracle.com/xdb/XDBResConfig.xsd' under complex type
--  'xlink-config'

-- ref to resconfig schema
  select ref(s) into rescfg_schema_ref
  from xdb.xdb$schema s
  where s.xmldata.schema_url = schema_url;

-- sequence child of complextype named xlink-config in resconfig schema
  select c.xmldata.sequence_kid into seq_ref
  from xdb.xdb$complex_type c
  where c.xmldata.name=complex_type and
        c.xmldata.parent_schema=rescfg_schema_ref;

-- varray of refs to elements that are children of sequence
-- where the sequence is the child of complextype named xlink-config
-- in resconfig schema
  select m.xmldata.elements into elem_list
  from xdb.xdb$sequence_model m
  where ref(m) = seq_ref;

  v_idx := elem_list.FIRST;
  << display_loop >>
  WHILE v_idx IS NOT NULL LOOP
    select e.xmldata.property.name into ename 
    from xdb.xdb$element e where ref(e) = elem_list(v_idx);
    if ename = ell_name then
      return TRUE;
    end if;
    v_idx := elem_list.NEXT(v_idx);
  END LOOP display_loop;

  return FALSE;
end;
/

show errors;

OHA YOOOO