MINI MINI MANI MO

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

Rem
Rem $Header: rdbms/admin/dbmsfi.sql /main/8 2017/07/13 14:43:09 skabraha Exp $
Rem
Rem dbmsfi.sql
Rem
Rem Copyright (c) 2002, 2017, Oracle and/or its affiliates. 
Rem All rights reserved.
Rem
Rem    NAME
Rem      dbmsfi.sql - DBMS Frequent Itemset package Declaration
Rem
Rem    DESCRIPTION
Rem      Declaration for the frequent itemset package
Rem
Rem    NOTES
Rem      <other useful comments, qualifications, etc.>
Rem
Rem
Rem BEGIN SQL_FILE_METADATA
Rem SQL_SOURCE_FILE: rdbms/admin/dbmsfi.sql
Rem SQL_SHIPPED_FILE: rdbms/admin/dbmsfi.sql
Rem SQL_PHASE: DBMSFI
Rem SQL_STARTUP_MODE: NORMAL
Rem SQL_IGNORABLE_ERRORS: NONE
Rem SQL_CALLING_FILE: rdbms/admin/catpdbms.sql
Rem END SQL_FILE_METADATA
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem    skabraha    06/29/17 - move to AnyTypeFromPersistent
Rem    surman      12/29/13 - 13922626: Update SQL metadata
Rem    surman      03/27/12 - 13615447: Add SQL patching tags
Rem    weili       09/25/03 - support NULL cursor 
Rem    weili       12/26/02 - create synonym for dbms_frequent_itemset
Rem    jihuang     12/20/02 - support any item type
Rem    weili       11/20/02 - weili_dbms_frequent_itemset
Rem    weili       11/07/02 - Created
Rem

@@?/rdbms/admin/sqlsessstart.sql
/* the following object will be used by table functions
 * supporting anonymous item type item  SYS.AnyData);
 */
create or replace library ora_fi_lib trusted as static
/

DROP TYPE itemsets;

DROP TYPE itemset;

CREATE OR REPLACE TYPE itemset AS OBJECT(
       itemset_id NUMBER, 
       support NUMBER, 
       length NUMBER,
       total_tranx   NUMBER, 
       item  SYS.AnyData);
/

CREATE TYPE itemsets AS TABLE OF itemset;
/

create or replace type fi_categoricals as table of varchar2(4000);
/
create or replace type fi_numericals as table of number;
/

create or replace type ora_fi_t authid current_user as object
(
  type_schema  varchar2(130),
  type_name    varchar2(130),
  cnum         number,
  finished     number,
  closed       number,
  is_char      number,

  static function ODCITableDescribe(
    coll_type out SYS.AnyType,
    cur IN OUT sys_refcursor
  ) return number,

  static function ODCITablePrepare(
    sctx OUT ora_fi_t,
    ti IN SYS.ODCITabFuncInfo,
    cur sys_refcursor
  ) return number,

  static function ODCITableStart(
    sctx IN OUT ora_fi_t,
    cur IN OUT sys_refcursor
  ) return number,

  member function ODCITableFetch(
    self IN OUT ora_fi_t,
    nrows number,
    out_coll OUT SYS.AnyDataSet
  ) return number,

  member function ODCITableClose(
    self IN ora_fi_t
  ) return number
);
/

create or replace type body ora_fi_t
is
  static function ODCITableDescribe(
    coll_type out SYS.AnyType,
    cur IN OUT sys_refcursor
  ) return number is
    itemset_type SYS.AnyType;
    elem_type SYS.AnyType;
    curnum number;
    numcols number;
    col_desc dbms_sql.desc_tab2;
  begin
    curnum := SYS.dbms_sql.to_cursor_number(cur);
    sys.dbms_sql.describe_columns2(curnum, numcols, col_desc);

    -- check 'item' column for char / number type and use the
    -- correct predefined collection in that case
    SYS.AnyType.BeginCreate(SYS.dbms_types.typecode_object, elem_type);
    if (col_desc(2).col_type = dbms_types.typecode_varchar or
        col_desc(2).col_type = dbms_types.typecode_varchar2 or 
        col_desc(2).col_type = dbms_types.typecode_char) then
      itemset_type := SYS.GetAnyTypeFromPersistent('SYS','FI_CATEGORICALS');
    else
      itemset_type := SYS.GetAnyTypeFromPersistent('SYS','FI_NUMERICALS');
    end if;
 
    elem_type.AddAttr('ITEMSET', SYS.dbms_types.typecode_table,
                      null, null, null, null, null, itemset_type);
    elem_type.AddAttr('SUPPORT', SYS.dbms_types.typecode_number,
                      null, null, null, null, null);
    elem_type.AddAttr('LENGTH', SYS.dbms_types.typecode_number,
                      null, null, null, null, null);
    elem_type.AddAttr('TOTAL_TRANX', SYS.dbms_types.typecode_number,
                      null, null, null, null, null);
    elem_type.EndCreate;

    SYS.AnyType.BeginCreate(SYS.dbms_types.typecode_table, coll_type);
    coll_type.SetInfo(null, null, null, null, null, elem_type,
                      SYS.dbms_types.typecode_object, 0);
    coll_type.EndCreate;

    cur := sys.dbms_sql.to_refcursor(curnum);

    return SYS.ODCIConst.Success;
  end;

  static function ODCITablePrepare(
    sctx OUT ora_fi_t,
    ti IN SYS.ODCITabFuncInfo,
    cur sys_refcursor
  ) return number is
    prec pls_integer;
    scale pls_integer;
    len pls_integer;
    csid pls_integer;
    csfrm pls_integer;
    attr_name varchar2(130);
    type_schema varchar2(130);
    type_name varchar2(130);
    version varchar2(130);
    num_elems pls_integer;
    tc pls_integer;
    is_char number := 0;
    elem_type SYS.AnyType;
    nescoll_type SYS.AnyType;
    neselem_type SYS.AnyType;
  begin
    -- Get element type name and schema
    tc := ti.RetType.GetAttrElemInfo(0, prec, scale, len, csid, csfrm,
                                     elem_type, attr_name);
    tc := elem_type.GetInfo(prec, scale, len, csid, csfrm, type_schema,
                            type_name, version, num_elems);
    -- Check if nested collection type is a string type
    tc := elem_type.GetAttrElemInfo(1, prec, scale, len, csid, csfrm,
                                    nescoll_type, attr_name);
    tc := nescoll_type.GetAttrElemInfo(0, prec, scale, len, csid, csfrm,
                                       neselem_type, attr_name);

    if (tc = SYS.dbms_types.typecode_char or
        tc = SYS.dbms_types.typecode_varchar or
        tc = SYS.dbms_types.typecode_varchar2) then
      is_char := 1;
    end if;

    -- Instantiate the SELF context
    sctx := ora_fi_t(type_schema, type_name, 0, 0, 0, is_char);

    return SYS.ODCIConst.Success;
  end;

  static function ODCITableStart(
    sctx IN OUT ora_fi_t,
    cur IN OUT sys_refcursor
  ) return number is
    curnum number;
  begin
    -- get cursor number
    SYS.dbms_odci.SaveRefCursor(cur, curnum);

    if (sctx is not null) then
      sctx.cnum := curnum;
      sctx.finished := 0;
      sctx.closed := 0;
    else
      -- we return error because ODCITablePrepare
      -- should have been called to initialize sctx
      return SYS.ODCIConst.Error;
    end if;

    return SYS.ODCIConst.Success;
  end;

  member function ODCITableFetch(
    self IN OUT ora_fi_t,
    nrows number,
    out_coll OUT SYS.AnyDataSet
  ) return number is
    idx number := 1;
    done boolean := false;
    itemset_id number;
    itemval_num number;
    itemval_str varchar2(4000);
    itemnum number;
    support number;
    length  number;
    total_tranx number;
    dummy number;
    item_type SYS.AnyType;
    vc2_coll fi_categoricals;
    num_coll fi_numericals;
    nes_coll SYS.AnydataSet;
    cur sys_refcursor;
    dummyval1 number;
    dummyval2 number;
    dummyval3 number;
  begin
    -- Initialize output collection to null
    out_coll := null;

    -- If we have fetched all rows, then just return
    -- the null collection
    if (self.finished != 0) then
      return SYS.ODCIConst.Success;
    end if;

    -- restore cursor number into sys_refcursor
    SYS.dbms_odci.RestoreRefCursor(cur, self.cnum);

    while (not done) loop
      if (idx > nrows) then
        -- We fetched all the required rows, so we are done
        done := true;
      elsif (cur%notfound is null or not cur%notfound) then
        -- There might be row to fetch...
        -- Start creation of AnyDataSet if we haven't done
        -- that yet
        if (out_coll is null) then
          item_type := SYS.GetAnyTypeFromPersistent(self.type_schema,
                                                    self.type_name);
          SYS.AnyDataSet.BeginCreate(SYS.dbms_types.typecode_object,
                                     item_type, out_coll);
        end if;

        -- Fetch the row values
        if (self.is_char != 0) then
          fetch cur into
            itemset_id, itemval_str, support, length, total_tranx;
        else
          fetch cur into
            itemset_id, itemval_num, support, length, total_tranx;
        end if;
        -- Skip if there are no more rows
        if (cur%notfound) then
          continue;
        end if;

        -- Add a new element
        out_coll.AddInstance;
        out_coll.Piecewise;
        -- Start creating the nested collection
        if (self.is_char != 0) then
          vc2_coll := fi_categoricals();
          vc2_coll.extend;
          vc2_coll(1) := itemval_str;
        else
          num_coll := fi_numericals();
          num_coll.extend;
          num_coll(1) := itemval_num;
        end if;

        -- Fetch all the rows in this itemset and add them to the
        -- nested collection
        for i in 1.. length - 1 loop
          if (self.is_char != 0) then
            fetch cur into
              itemset_id, itemval_str, dummyval1, dummyval2, dummyval3;
          else
            fetch cur into
              itemset_id, itemval_num, dummyval1, dummyval2, dummyval3;
          end if;

          -- We only need the item value
          if (self.is_char != 0) then
            vc2_coll.extend;
            vc2_coll(i + 1) := itemval_str;
          else
            num_coll.extend;
            num_coll(i + 1) := itemval_num;
          end if;
        end loop;

        -- itemset field
        if (self.is_char != 0) then
          out_coll.SetCollection(vc2_coll);
        else
          out_coll.SetCollection(num_coll);
        end if;
        -- support field
        out_coll.SetNumber(support);
        -- length field
        out_coll.SetNumber(length);
        -- total_tranx field
        out_coll.SetNumber(total_tranx);
      else
        -- No more rows to fetch on the cursor, so we are done.
        -- Also, set finished and closed flags
        done := true;
        self.finished := 1;
        close cur;
        self.closed := 1;
      end if;
      idx := idx + 1;
    end loop;

    if (out_coll is not null) then
      out_coll.EndCreate;
    end if;

    return SYS.ODCIConst.Success;
  end;

  member function ODCITableClose(
    self IN ora_fi_t
  ) return number is
    curnum number := SELF.cnum;
    is_closed number := SELF.closed;
    cur sys_refcursor;
  begin
    -- Was the cursor already closed?
    -- If some error occurred halfway through fetchs,
    -- then ODCITableClose will be called during cleanup
    if (is_closed = 0) then
      SYS.dbms_odci.RestoreRefCursor(cur, curnum);
      close cur;
    end if;

    return SYS.ODCIConst.Success;
  end;
end;
/

CREATE OR REPLACE TYPE ora_fi_RImp_t AS OBJECT
(
  dummy NUMBER,

  STATIC FUNCTION ODCITableDescribe(typ OUT SYS.AnyType, cur SYS_REFCURSOR)
    RETURN PLS_INTEGER
  IS
  LANGUAGE C
  LIBRARY ora_fi_lib
  NAME "ODCITableDescribe"
  WITH CONTEXT
  PARAMETERS (
    CONTEXT,
    typ,
    typ INDICATOR,
    cur,
    cur TDO,
    RETURN INT
  ),

  STATIC FUNCTION ODCITableRewrite(
    sctx               OUT  ora_fi_RImp_t,
    ti                  IN  SYS.ODCITabFuncInfo,
    str                OUT  CLOB,
    tranx_cursor        IN  SYS_REFCURSOR,
    support_threshold   IN  NUMBER,
    itemset_length_min  IN  NUMBER,
    itemset_length_max  IN  NUMBER,
    including_items     IN  SYS_REFCURSOR,
    excluding_items     IN  SYS_REFCURSOR
  ) RETURN PLS_INTEGER
  IS
  LANGUAGE C
  LIBRARY ora_fi_lib
  NAME "ODCITableRewrite"
  WITH CONTEXT
  PARAMETERS (
    CONTEXT,
    sctx,
    sctx INDICATOR STRUCT,
    ti,
    ti INDICATOR STRUCT,
    str,
    str INDICATOR,
    tranx_cursor,
    tranx_cursor TDO,
    support_threshold,
    support_threshold INDICATOR,
    itemset_length_min,
    itemset_length_min INDICATOR,
    itemset_length_max,
    itemset_length_max INDICATOR,
    including_items,
    including_items TDO,
    excluding_items,
    excluding_items TDO,
    RETURN INT
  )
);
/

CREATE OR REPLACE TYPE ora_fi_Imp_t AS OBJECT
(
  dummy NUMBER,

  STATIC FUNCTION ODCITableDescribe(typ OUT SYS.AnyType, cur SYS_REFCURSOR)
    RETURN PLS_INTEGER
  IS
  LANGUAGE C
  LIBRARY ora_fi_lib
  NAME "ODCITableDescribe"
  WITH CONTEXT
  PARAMETERS (
    CONTEXT,
    typ,
    typ INDICATOR,
    cur,
    cur TDO,
    RETURN INT
  )
);
/

CREATE or REPLACE PACKAGE dbms_frequent_itemset AUTHID CURRENT_USER AS

FUNCTION fi_transactional(
  tranx_cursor          IN  SYS_REFCURSOR,
  support_threshold     IN  NUMBER,
  itemset_length_min    IN  NUMBER,
  itemset_length_max    IN  NUMBER,
  including_items       IN  SYS_REFCURSOR DEFAULT NULL,
  excluding_items       IN  SYS_REFCURSOR DEFAULT NULL)
RETURN SYS.AnyDataSet pipelined parallel_enable using ora_fi_RImp_t;
 
FUNCTION fi_horizontal(
  tranx_cursor          IN  SYS_REFCURSOR,
  support_threshold     IN  NUMBER,
  itemset_length_min    IN  NUMBER,
  itemset_length_max    IN  NUMBER,
  including_items       IN  SYS_REFCURSOR DEFAULT NULL,
  excluding_items       IN  SYS_REFCURSOR DEFAULT NULL)
RETURN SYS.AnyDataSet pipelined parallel_enable using ora_fi_RImp_t;

FUNCTION fi_transactional_inner(
  tranx_cursor          IN  SYS_REFCURSOR,
  support_threshold     IN  NUMBER,
  itemset_length_min    IN  NUMBER,
  itemset_length_max    IN  NUMBER,
  including_items       IN  SYS_REFCURSOR DEFAULT NULL,
  excluding_items       IN  SYS_REFCURSOR DEFAULT NULL)
RETURN itemsets pipelined parallel_enable using ora_fi_Imp_t;

FUNCTION fi_horizontal_inner(
  tranx_cursor          IN  SYS_REFCURSOR,
  support_threshold     IN  NUMBER,
  itemset_length_min    IN  NUMBER,
  itemset_length_max    IN  NUMBER,
  including_items       IN  SYS_REFCURSOR DEFAULT NULL,
  excluding_items       IN  SYS_REFCURSOR DEFAULT NULL)
RETURN itemsets pipelined parallel_enable using ora_fi_Imp_t;


function fi_transactional_outer(
  cur sys_refcursor
) return SYS.AnyDataSet pipelined using ora_fi_t;

END;
/

CREATE or REPLACE PUBLIC SYNONYM dbms_frequent_itemset for sys.dbms_frequent_itemset
/

GRANT EXECUTE on dbms_frequent_itemset TO PUBLIC
/

GRANT EXECUTE on ora_fi_Imp_t TO PUBLIC
/

GRANT EXECUTE on ora_fi_RImp_t TO PUBLIC
/

GRANT EXECUTE on fi_categoricals TO PUBLIC
/

GRANT EXECUTE on fi_numericals TO PUBLIC
/

GRANT EXECUTE on itemsets TO PUBLIC
/

GRANT EXECUTE on itemset TO PUBLIC
/

GRANT EXECUTE on ora_fi_t TO PUBLIC
/

@?/rdbms/admin/sqlsessend.sql

OHA YOOOO