前几天有人发了一个利用olap包作数学表达式求值的帖子找不到了了

[复制链接]
查看11 | 回复9 | 2012-5-21 10:19:41 | 显示全部楼层 |阅读模式
请告知
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
DBMS_AW.EVAL_NUMBER
参见oracle 官方文档中的 Oracle OLAP Reference


回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
http://www.itpub.net/thread-1266657-2-1.html
这个帖子的吧
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
谢谢各位,
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
好奇怪,同样11.1企业版,一个有此函数,另一个没有,怎么把没有的装上?
SQL> select DBMS_AW.EVAL_NUMBER('1+1') from dual;
select DBMS_AW.EVAL_NUMBER('1+1') from dual
*
第 1 行出现错误:
ORA-12663: 服务器无法提供客户机要求的服务
ORA-36961: Oracle OLAP 不可用。
ORA-06512: 在 "SYS.DBMS_AW", line 203
ORA-06512: 在 "SYS.DBMS_AW", line 212

已用时间:00: 00: 00.13
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE11.1.0.7.0Production
TNS for IBM/AIX RISC System/6000: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production
已用时间:00: 00: 00.00
SQL> select * from v$option where parameter like '%OLAP%';
PARAMETER
VALUE
---------------------------------------------------------------- ----------------
OLAP Window Functions
TRUE
OLAP
FALSE
已用时间:00: 00: 00.02
~~~~~~~
SQL> select DBMS_AW.EVAL_NUMBER('1+1') from dual;
DBMS_AW.EVAL_NUMBER('1+1')
--------------------------

2
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE11.1.0.7.0Production
TNS for 64-bit Windows: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production
SQL> desc v$options
ERROR:
ORA-04043: 对象 v$options 不存在

SQL> desc v$option
名称
是否为空? 类型
----------------------------------------- -------- ----------------------------
PARAMETER
VARCHAR2(64)
VALUE
VARCHAR2(64)
SQL> select * from v$option where parameter like '%OLAP%';
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
OLAP Window Functions
TRUE
OLAP
TRUE
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
找到了package定义
SQL> set lines 132 pages 50000
SQL> select text from dba_source where name='DBMS_AW';
TEXT
----------------------------------------------------------------------------------------------------------------------
PACKAGE dbms_aw AUTHID CURRENT_USER AS
---------------------
--OVERVIEW
--
--This package is the interface to the Express server routines.
--interp - This function interprets an OLAP DML command and
--
returns the output as a character LOB.
--execute- This procedure executes an OLAP DML command and uses
--
dbms_output to print the results.
--
---------------------
--Visibility
-- All users
--
---------------------
--PROCEDURES
PROCEDURE initdriver;
PROCEDURE startup;
PROCEDURE shutdown(force IN BOOLEAN DEFAULT FALSE);
PROCEDURE toggleDBCreate;
FUNCTIONinterpclob(cmd_clob IN CLOB) RETURN CLOB;
FUNCTIONgetlog return clob;
PROCEDURE printlog(log_clob IN CLOB);
-- Routines which handle output for the user
PROCEDURE run(cmd IN STRING, silent IN
BOOLEAN DEFAULT FALSE);
PROCEDURE run(cmd IN CLOB, silent IN
BOOLEAN DEFAULT FALSE);
-- Routines which pass data back
PROCEDURE run(cmd IN STRING, outputOUTSTRING);
PROCEDURE run(cmd IN STRING, output IN OUT NOCOPY CLOB);
PROCEDURE run(cmd IN CLOB, outputOUTSTRING);
PROCEDURE run(cmd IN CLOB, output IN OUT NOCOPY CLOB);
PROCEDURE execute(cmd IN STRING);
FUNCTIONinterp(cmd IN string) RETURN clob;
PROCEDURE interp_silent(cmd IN STRING);
PROCEDURE infile(ifilename IN STRING);
FUNCTIONeval_number(cmd IN STRING) RETURN NUMBER;
FUNCTIONeval_text(cmd IN STRING) RETURN VARCHAR2;
FUNCTIONolap_on RETURN BOOLEAN;
FUNCTIONolap_running RETURN BOOLEAN;
FUNCTIONolap_active RETURN BOOLEAN;
PROCEDURE advise_rel(relnameIN VARCHAR2,

valueset IN VARCHAR2,

pctIN BINARY_INTEGER DEFAULT 20,

compressed IN BOOLEANDEFAULT FALSE);
PROCEDURE advise_cube( aggmap IN VARCHAR2,

pctIN BINARY_INTEGER DEFAULT 20,

compressed IN BOOLEANDEFAULT FALSE);
PROCEDURE enable_access_tracking(objname IN VARCHAR2);
PROCEDURE disable_access_tracking(objname IN VARCHAR2);
PROCEDURE clean_access_tracking(objname IN VARCHAR2);
NO_HIER
CONSTANT BINARY_INTEGER := 0;
MEASURE
CONSTANT BINARY_INTEGER := 1;
HIER_PARENTCHILDCONSTANT BINARY_INTEGER := 2;
HIER_LEVELS
CONSTANT BINARY_INTEGER := 3;
HIER_SNOWFLAKE
CONSTANT BINARY_INTEGER := 4;
PARTBY_DEFAULT
CONSTANT BINARY_INTEGER := 0;
PARTBY_NONE
CONSTANT BINARY_INTEGER := 1;
PARTBY_FORCE
CONSTANT BINARY_INTEGER := 2147483647;
ADVICE_DEFAULT CONSTANT BINARY_INTEGER := 0;
ADVICE_FASTCONSTANT BINARY_INTEGER := 1;
ADVICE_FULLCONSTANT BINARY_INTEGER := 2;
PROCEDURE sparsity_advice_table(tblname IN VARCHAR2 DEFAULT NULL);
PROCEDURE add_dimension_source(dimnameINVARCHAR2,

colnameINVARCHAR2,

sourcesIN OUTdbms_aw$_dimension_sources_t,

srcval INVARCHAR2 DEFAULT NULL,

dimtypeINNUMBER DEFAULT NO_HIER,

hiercols INdbms_aw$_columnlist_t

DEFAULT NULL,

partby INNUMBER

DEFAULT PARTBY_DEFAULT);
PROCEDURE advise_sparsity(fact INVARCHAR2,

cubename INVARCHAR2,

dimsources INdbms_aw$_dimension_sources_t,

advmodeINBINARY_INTEGER

DEFAULT ADVICE_DEFAULT,

partby INBINARY_INTEGER

DEFAULT PARTBY_DEFAULT,

advtable INVARCHAR2 DEFAULT NULL);
FUNCTION advise_dimensionality(cubename IN VARCHAR2,

sparsedfn OUT VARCHAR2,

sparsename IN VARCHAR2 DEFAULT NULL,

partnumIN NUMBER DEFAULT 1,

advtable IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2;
PROCEDURE advise_dimensionality(outputOUT NOCOPY CLOB,

cubename IN VARCHAR2,

sparsename IN VARCHAR2 DEFAULT NULL,

dtypeIN VARCHAR2 DEFAULT 'NUMBER',

advtable IN VARCHAR2 DEFAULT NULL);
FUNCTION advise_partitioning_dimension(cubename IN VARCHAR2,

dimsources IN dbms_aw$_dimension_sources_t,

advtable IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2;
FUNCTION advise_partitioning_level(cubenameIN VARCHAR2,

dimsources IN dbms_aw$_dimension_sources_t,

advtable IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2;
PROCEDURE aw_update(name IN VARCHAR2 DEFAULT NULL);
PROCEDURE aw_update(schema IN VARCHAR2,

name IN VARCHAR2);
PROCEDURE aw_attach(name IN VARCHAR2,

forwrite IN BOOLEANDEFAULT FALSE,

createaw IN BOOLEANDEFAULT FALSE,

attargsIN VARCHAR2 DEFAULT NULL,

tbspaceIN VARCHAR2 DEFAULT NULL);
PROCEDURE aw_attach(schema IN VARCHAR2,

name IN VARCHAR2,

forwrite IN BOOLEANDEFAULT FALSE,

createaw IN BOOLEANDEFAULT FALSE,

attargsIN VARCHAR2 DEFAULT NULL,

tbspaceIN VARCHAR2 DEFAULT NULL);
PROCEDURE aw_detach(name IN VARCHAR2);
PROCEDURE aw_detach(schema IN VARCHAR2,

name IN VARCHAR2);
PROCEDURE aw_create(name IN VARCHAR2,

tbspaceIN VARCHAR2 DEFAULT NULL,

partnumIN NUMBER DEFAULT 8);
PROCEDURE aw_copy(oldname IN VARCHAR2,

newname IN VARCHAR2,

newtablespace IN VARCHAR2 DEFAULT NULL,

partnum IN NUMBER DEFAULT 8);
PROCEDURE aw_copy(oldschema IN VARCHAR2,

oldname IN VARCHAR2,

newname IN VARCHAR2,

newtablespace IN VARCHAR2 DEFAULT NULL,

partnum IN NUMBER DEFAULT 8);
PROCEDURE aw_create(schema IN VARCHAR2,

name IN VARCHAR2,

tbspaceIN VARCHAR2 DEFAULT NULL);
PROCEDURE aw_delete(name IN VARCHAR2);
PROCEDURE aw_delete(schema IN VARCHAR2,

name IN VARCHAR2);
PROCEDURE aw_rename(inname IN VARCHAR2,

outnameIN VARCHAR2);
FUNCTIONaw_tablespace(schema IN VARCHAR2,

name IN VARCHAR2) RETURN VARCHAR2;
FUNCTIONaw_tablespace(name IN VARCHAR2) RETURN VARCHAR2;
TYPE eif_t IS TABLE OF BLOB NOT NULL;
TYPE eif_objlist_t IS TABLE OF VARCHAR2(100);
-- Enumerated Types for the datadfns param to EIF import
EIFIMP_DATACONSTANT BINARY_INTEGER := 1;
EIFIMP_DEFINES CONSTANT BINARY_INTEGER := 2;
EIFIMP_DFNSCONSTANT BINARY_INTEGER := EIFIMP_DEFINES;
EIFIMP_DATADEFINES CONSTANT BINARY_INTEGER := 3;
EIFIMP_DATADFNSCONSTANT BINARY_INTEGER := EIFIMP_DATADEFINES;
AWNAME_IS_NULL EXCEPTION;
FUNCTIONeif_blob_out(name IN VARCHAR2,

objlist IN eif_objlist_t DEFAULT NULL) RETURN BLOB;
FUNCTIONeif_blob_out(schema IN VARCHAR2, name IN VARCHAR2,

objlist IN eif_objlist_t DEFAULT NULL) RETURN BLOB;
PROCEDURE eif_blob_in(name IN VARCHAR2, implob IN BLOB,

datadfns IN BINARY_INTEGER DEFAULT EIFIMP_DATA,

objlistIN eif_objlist_tDEFAULT NULL);
PROCEDURE eif_blob_in(schema IN VARCHAR2, name IN VARCHAR2, implob IN BLOB,

datadfns IN BINARY_INTEGER DEFAULT EIFIMP_DATA,

objlistIN eif_objlist_tDEFAULT NULL);
PROCEDURE eif_out(name IN VARCHAR2, expeif OUT eif_t,

objlist IN eif_objlist_t DEFAULT NULL,

dfns IN BOOLEAN DEFAULT FALSE);
PROCEDURE eif_out(schema IN VARCHAR2, name IN VARCHAR2, expeif OUT eif_t,

objlist IN eif_objlist_t DEFAULT NULL,

dfns IN BOOLEAN DEFAULT FALSE);
PROCEDURE eif_in(name IN VARCHAR2, impeif IN eif_t,

datadfns IN BINARY_INTEGER DEFAULT EIFIMP_DATA,

objlist IN eif_objlist_t DEFAULT NULL);
PROCEDURE eif_in(schema IN VARCHAR2, name IN VARCHAR2, impeif IN eif_t,

datadfns IN BINARY_INTEGER DEFAULT EIFIMP_DATA,

objlist IN eif_objlist_t DEFAULT NULL);
PROCEDURE eif_delete(eif IN OUT eif_t);
FUNCTIONget_obj_protect RETURN BOOLEAN;
PROCEDURE set_obj_protect(val IN BOOLEAN);
bad_compat_error NUMBER := -20002;
aw_changed_error NUMBER := -20003;
awname_null_error NUMBER := -20004;
has_schema_error NUMBER := -20005;
bad_snowflake_error NUMBER := -20006;
PROCEDURE convert (awname IN VARCHAR2);
PROCEDURE convert (oldname IN VARCHAR2, newname IN VARCHAR2,

newtablespace IN VARCHAR2 DEFAULT NULL);
en_tbs_error NUMBER := -20001;
PROCEDURE move_awmeta(dest_tbs IN VARCHAR2);
FUNCTION prop_val(rid IN ROWID) RETURN VARCHAR2;
FUNCTION olap_type(otype IN NUMBER) RETURN VARCHAR2;
FUNCTION prop_clob(rid IN ROWID) RETURN CLOB;
FUNCTION prop_len(rid IN ROWID) RETURN NUMBER;
PROCEDURE gather_stats;
-- Internal types, not for user consumption
TYPE loblineiter_t IS RECORD (
mylob CLOB,
loc NUMBER,
clength NUMBER,
cmaxNUMBER,
linemax NUMBER);
END dbms_aw;
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
包体unwrap后的结果
PACKAGE BODY dbms_aw AS
DEFAULT_SPSADVICE_TABLE CONSTANT VARCHAR2(18) := 'AW_SPARSITY_ADVICE';
CMDLOGCLOB;
PROPLOB CLOB;
ENDLN VARCHAR2(1) := '
';
PROCEDURE STARTUP IS
EXTERNAL NAME "xsinitdriver"
WITH CONTEXT
PARAMETERS(CONTEXT)
LIBRARY DBMS_AW_LIB;
PROCEDURE SHUTDOWN(FORCE IN BOOLEAN DEFAULT FALSE) IS
EXTERNAL NAME "xskilldriver"
WITH CONTEXT
PARAMETERS(CONTEXT, FORCE)
LIBRARY DBMS_AW_LIB;
PROCEDURE INITDRIVER IS
BEGIN
STARTUP();
END;
PROCEDURE TOGGLEDBCREATE IS
BEGIN
RETURN;
END;
PROCEDURE INIT_CMDLOG IS
BEGIN
IF CMDLOG IS NULL THEN
DBMS_LOB.CREATETEMPORARY(CMDLOG, TRUE);
ELSE
DBMS_LOB.TRIM(CMDLOG, 0);
END IF;
END;

PROCEDURE XSRUNKK( CMDIN
STRING,

OUTPUTOUTSTRING) IS
EXTERNAL NAME "xsRunKK"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMDOCISTRING,

OUTPUT OCISTRING,

OUTPUT MAXLENUB4)
LIBRARY DBMS_AW_LIB;
PROCEDURE XSRUNLN( CMDIN
CLOB) IS
EXTERNAL NAME "xsRunLN"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMD)
LIBRARY DBMS_AW_LIB;
PROCEDURE XSRUNKL( CMD
STRING,

OUTLOB IN OUT NOCOPY CLOB) IS
EXTERNAL NAME "xsRunKL"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMDOCISTRING,

OUTLOB)
LIBRARY DBMS_AW_LIB;
PROCEDURE XSRUNKN( CMDIN
STRING) IS
EXTERNAL NAME "xsRunKN"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMDOCISTRING)
LIBRARY DBMS_AW_LIB;
PROCEDURE XSRUNLL( CMDIN
CLOB,

OUTLOB IN OUT NOCOPY CLOB) IS
EXTERNAL NAME "xsRunLL"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMD,

OUTLOB)
LIBRARY DBMS_AW_LIB;
PROCEDURE XSRUNLK( CMDIN
CLOB,

OUTPUTOUTSTRING) IS
EXTERNAL NAME "xsRunLK"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMD,

OUTPUT OCISTRING,

OUTPUT MAXLENUB4)
LIBRARY DBMS_AW_LIB;
PROCEDURE XSCMDEXCKL(CMD
STRING,

OUTLOB IN OUT NOCOPY CLOB) IS
EXTERNAL NAME "xsCmdExcKL"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMDOCISTRING,

OUTLOB)
LIBRARY DBMS_AW_LIB;
PROCEDURE XSCMDEXCKN(CMDIN
STRING) IS
EXTERNAL NAME "xsCmdExcKN"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMDOCISTRING)
LIBRARY DBMS_AW_LIB;
PROCEDURE XSCMDEXCLL(CMDIN
CLOB,

OUTLOB IN OUT NOCOPY CLOB) IS
EXTERNAL NAME "xsCmdExcLL"
WITH CONTEXT
PARAMETERS(CONTEXT,

CMD,

OUTLOB)
LIBRARY DBMS_AW_LIB;
PROCEDURE EXECUTE(CMD IN STRING) IS
BEGIN
DBMS_OUTPUT.ENABLE(100000);
INIT_CMDLOG;
XSCMDEXCKL(CMD, CMDLOG);
PRINTLOG(CMDLOG);
END;

PROCEDURERUN(CMDIN
STRING,

SILENT IN
BOOLEAN DEFAULT FALSE) IS
BEGIN
IF SILENT THEN
XSRUNKN(CMD);
ELSE
INIT_CMDLOG;
XSRUNKL(CMD, CMDLOG);
PRINTLOG(CMDLOG);
END IF;
END;
PROCEDURERUN(CMDIN
CLOB,

SILENT IN
BOOLEAN DEFAULT FALSE) IS
BEGIN
IF SILENT THEN
XSRUNLN(CMD);
ELSE
INIT_CMDLOG;
XSRUNLL(CMD, CMDLOG);
PRINTLOG(CMDLOG);
END IF;
END;

PROCEDURERUN(CMDIN
STRING,

OUTPUTOUTSTRING) IS
BEGIN
XSRUNKK(CMD, OUTPUT);
END;
PROCEDURERUN(CMDIN
STRING,

OUTPUT IN OUT NOCOPY CLOB) IS
BEGIN
XSRUNKL(CMD, OUTPUT);
END;
PROCEDURERUN(CMDIN
CLOB,

OUTPUTOUTSTRING) IS
BEGIN
XSRUNLK(CMD, OUTPUT);
END;
PROCEDURERUN(CMDIN
CLOB,

OUTPUT IN OUT NOCOPY CLOB) IS
BEGIN
XSRUNLL(CMD, OUTPUT);
END;
FUNCTION INTERP(CMD IN STRING)
RETURN CLOB AS
BEGIN
INIT_CMDLOG;
XSCMDEXCKL(CMD, CMDLOG);
RETURN CMDLOG;
END;
PROCEDURE INTERP_SILENT(CMD IN STRING) IS
BEGIN
XSCMDEXCKN(CMD);
END;
FUNCTION INTERPCLOB(CMD_CLOB IN CLOB)
RETURN CLOB AS
BEGIN
INIT_CMDLOG;
XSCMDEXCLL(CMD_CLOB, CMDLOG);
RETURN CMDLOG;
END;
FUNCTION GETLOG
RETURN CLOB AS
BEGIN
RETURN CMDLOG;
END;
FUNCTIONXSEVALNUM(CMD IN STRING, RET OUT NUMBER) RETURN BOOLEAN IS
EXTERNAL NAME "xsevalnum"
WITH CONTEXT PARAMETERS(CONTEXT, CMD STRING, RET OCINUMBER)
LIBRARY DBMS_AW_LIB;
FUNCTIONEVAL_NUMBER(CMD IN STRING) RETURN NUMBER
IS
RET NUMBER;
BEGIN
IF XSEVALNUM(CMD, RET) THEN
RETURN RET;
ELSE
RETURN NULL;
END IF;
END EVAL_NUMBER;
FUNCTIONEVAL_TEXT(CMD IN STRING) RETURN VARCHAR2 IS
EXTERNAL NAME "xsevaltxt"
WITH CONTEXT PARAMETERS(CONTEXT, CMD STRING)
LIBRARY DBMS_AW_LIB;
PROCEDURE LOBLINEITER_INIT(CTX IN OUTLOBLINEITER_T,

MYLOB IN
CLOB,

LINEMAX IN
NUMBER) IS
BEGIN
CTX.MYLOB := MYLOB;
CTX.LOC := 1;
CTX.CLENGTH := DBMS_LOB.GETLENGTH(MYLOB);
IF CTX.CLENGTH IS NULL THEN
CTX.CLENGTH := 0;
END IF;
CTX.CMAX := CTX.CLENGTH;
CTX.LINEMAX := LINEMAX;
END LOBLINEITER_INIT;
FUNCTION LOBLINEITER_NEXT(CTXIN OUT LOBLINEITER_T,

LINEOUT VARCHAR2) RETURN BOOLEAN
IS
POS NUMBER;
WIDTH NUMBER;
BEGIN
IF CTX.LOC > CTX.CMAX THEN
RETURN FALSE;
END IF;
POS := DBMS_LOB.INSTR(CTX.MYLOB, ENDLN, CTX.LOC);
IF POS = 0 THEN
WIDTH := CTX.CMAX - CTX.LOC + 1;
ELSE
WIDTH := POS - CTX.LOC;
END IF;
IF WIDTH > CTX.LINEMAX THEN
WIDTH := CTX.LINEMAX;
END IF;
IF WIDTH > 0 THEN
DBMS_LOB.READ(CTX.MYLOB, WIDTH, CTX.LOC, LINE);
END IF;
CTX.CLENGTH := CTX.CLENGTH - WIDTH - 1;
CTX.LOC := CTX.LOC + WIDTH + 1;
RETURN TRUE;
END LOBLINEITER_NEXT;

PROCEDURE PRINTLOG(LOG_CLOB IN CLOB) AS
COUTPUT VARCHAR2(32767);
LOBCTXLOBLINEITER_T;
WIDTH NUMBER;
BEGIN
LOBLINEITER_INIT(LOBCTX, LOG_CLOB, 32768);
WHILE LOBLINEITER_NEXT(LOBCTX, COUTPUT) LOOP
WIDTH := LENGTH(COUTPUT);
IF WIDTH > 0 THEN
DBMS_OUTPUT.PUT_LINE(COUTPUT);
ELSE
DBMS_OUTPUT.PUT_LINE('');
END IF;
END LOOP;
END;
PROCEDURE INFILE(IFILENAME IN STRING) IS
BEGIN
EXECUTE('INFILE ''' || IFILENAME || ''' NOW');
END;
FUNCTION OLAP_ON RETURN BOOLEAN IS
OON NUMBER;
BEGIN
SELECT COUNT(*) INTO OON FROM V$OPTION
WHERE PARAMETER = 'OLAP' AND VALUE = 'TRUE';
RETURN (OON > 0);
END;
FUNCTION OLAP_RUNNING RETURN BOOLEAN
IS EXTERNAL NAME "xsrunning" WITH CONTEXT
PARAMETERS(CONTEXT)
LIBRARY DBMS_AW_LIB;
FUNCTION OLAP_ACTIVE RETURN BOOLEAN
IS EXTERNAL NAME "xsisactive" WITH CONTEXT
PARAMETERS(CONTEXT)
LIBRARY DBMS_AW_LIB;

PROCEDURE ADVISE_REL(RELNAMEIN VARCHAR2,

VALUESET IN VARCHAR2,

PCTIN BINARY_INTEGER DEFAULT 20,

COMPRESSED IN BOOLEANDEFAULT FALSE)
IS
EXTERNAL NAME "xsagAdvRel"
WITH CONTEXT
PARAMETERS(CONTEXT, RELNAME OCISTRING, VALUESET OCISTRING, PCT SB4,

COMPRESSED UB4)
LIBRARY DBMS_AW_LIB;
PROCEDURE ADVISE_CUBE( AGGMAP IN VARCHAR2,

PCTIN BINARY_INTEGER DEFAULT 20,

COMPRESSED IN BOOLEANDEFAULT FALSE)
IS
EXTERNAL NAME "xsagAdvCube"
WITH CONTEXT
PARAMETERS(CONTEXT, AGGMAP OCISTRING, PCT SB4, COMPRESSED UB4)
LIBRARY DBMS_AW_LIB;

PROCEDURE ENABLE_ACCESS_TRACKING(OBJNAME IN VARCHAR2)
IS
EXTERNAL NAME "xscatEnable"
WITH CONTEXT
PARAMETERS(CONTEXT, OBJNAME OCISTRING)
LIBRARY DBMS_AW_LIB;
PROCEDURE DISABLE_ACCESS_TRACKING(OBJNAME IN VARCHAR2)
IS
EXTERNAL NAME "xscatDisable"
WITH CONTEXT
PARAMETERS(CONTEXT, OBJNAME OCISTRING)
LIBRARY DBMS_AW_LIB;
PROCEDURE CLEAN_ACCESS_TRACKING(OBJNAME IN VARCHAR2)
IS
EXTERNAL NAME "xscatClean"
WITH CONTEXT
PARAMETERS(CONTEXT, OBJNAME OCISTRING)
LIBRARY DBMS_AW_LIB;

FUNCTION ADVISE_TABLE_NAME(ADVTABLE IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
IF ADVTABLE IS NULL THEN
RETURN DEFAULT_SPSADVICE_TABLE;
ELSE
RETURN DBMS_ASSERT.SIMPLE_SQL_NAME(ADVTABLE);
END IF;
END ADVISE_TABLE_NAME;
PROCEDURE SPARSITY_ADVICE_TABLE(TBLNAME IN VARCHAR2 DEFAULT NULL)
IS
TBLNAME_I VARCHAR2(100);
BEGIN
TBLNAME_I := ADVISE_TABLE_NAME(TBLNAME);
EXECUTE IMMEDIATE
'CREATE TABLE ' || TBLNAME_I || '(
cubename VARCHAR2(100) NOT NULL,
fact VARCHAR2(4000)NOT NULL,
dimensionVARCHAR2(100) NOT NULL,
dimcolumnVARCHAR2(100),
dimsourceVARCHAR2(4000),
membercountNUMBER(12,0),
leafcountNUMBER(12,0),
advice VARCHAR2(10)NOT NULL,
position NUMBER(4,0) NOT NULL,
densityNUMBER(11,8),
partnumNUMBER(6,0) NOT NULL,
partby CLOB,
parttops CLOB,
partlevelVARCHAR2(200))';
END;



PROCEDURE ADD_DIMENSION_SNOWFLAKE(DIMNAMEINVARCHAR2,

COLNAMEINVARCHAR2,

SOURCESIN OUTDBMS_AW$_DIMENSION_SOURCES_T,

ORGVAL INVARCHAR2,

DIMTYPEINNUMBER DEFAULT NO_HIER,

HIERCOLS INDBMS_AW$_COLUMNLIST_T

DEFAULT NULL,

PARTBY INNUMBER

DEFAULT PARTBY_DEFAULT)
IS
DIMSOURCE DBMS_AW$_DIMENSION_SOURCE_T;
SRCTABLES DBMS_AW$_COLUMNLIST_T;
NEWHIERCOLS DBMS_AW$_COLUMNLIST_T;
I NUMBER;
DOTPOINT NUMBER;
TABLENAME VARCHAR2(100);
OWNERNAME VARCHAR2(100);
COLUMN VARCHAR2(100);
V_TABLE NUMBER;
SRCVAL VARCHAR2(32767);
BEGIN

SRCTABLES := DBMS_AW$_COLUMNLIST_T();
SRCVAL := ORGVAL;
DOTPOINT := INSTR(SRCVAL, ',');
WHILE DOTPOINT > 0 LOOP
TABLENAME := TRIM(SUBSTR(SRCVAL, 0, DOTPOINT-1));
SRCVAL := TRIM(SUBSTR(SRCVAL, DOTPOINT+1));
SRCTABLES.EXTEND(1);
SRCTABLES(SRCTABLES.COUNT) := TABLENAME;
DOTPOINT := INSTR(SRCVAL, ',');
END LOOP;
SRCTABLES.EXTEND(1);
SRCTABLES(SRCTABLES.COUNT) := SRCVAL;



IF HIERCOLS.COUNTSRCTABLES.COUNT*2 THEN
RAISE_APPLICATION_ERROR(BAD_SNOWFLAKE_ERROR,
'The number of columns does not match ' ||
'the number of source tables.');
END IF;


FOR I IN 1..SRCTABLES.COUNT LOOP
DOTPOINT := INSTR(SRCTABLES(I), '.');
IF DOTPOINT > 0 THEN

OWNERNAME := TRIM(SUBSTR(SRCTABLES(I), 0, DOTPOINT-1));

TABLENAME := TRIM(SUBSTR(SRCTABLES(I), DOTPOINT+1));

SELECT COUNT(*) INTO V_TABLE FROM ALL_TABLES

WHERE TABLE_NAME = UPPER(TABLENAME)

AND OWNER = UPPER(OWNERNAME);
ELSE

SELECT COUNT(*) INTO V_TABLE FROM USER_TABLES

WHERE TABLE_NAME = UPPER(SRCTABLES(I));
END IF;
IF V_TABLE ';
SPARSEDFN := SPARSEDFN || '>';
END IF;
DIMLIST := '';
RETURN DIMLIST;
END ADVISE_DIMENSIONALITY;
PROCEDURE LOB_STRINGAPPEND(OUTPUT IN OUT NOCOPY CLOB,

STRIN
VARCHAR2) IS
BEGIN
DBMS_LOB.WRITEAPPEND(OUTPUT, LENGTH(STR), STR);
END LOB_STRINGAPPEND;
FUNCTION PARTNAME(BASEIN VARCHAR2,

PARTNUM IN NUMBER) RETURN VARCHAR2 IS
BEGIN
RETURN BASE || '_p' || PARTNUM;
END PARTNAME;
FUNCTION TEMPLATENAME(BASE IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN BASE || '_pt';
END TEMPLATENAME;
PROCEDURE ADVISE_DIMENSIONALITY(OUTPUTOUT NOCOPY CLOB,

CUBENAME IN VARCHAR2,

SPARSENAME IN VARCHAR2 DEFAULT NULL,

DTYPEIN VARCHAR2 DEFAULT 'NUMBER',

ADVTABLE IN VARCHAR2 DEFAULT NULL)
IS
LOBCTX LOBLINEITER_T;
NPARTS NUMBER;
CUBEDEFVARCHAR2(32767);
SPARSEDEFVARCHAR2(32767);
SPARSENAME_I VARCHAR2(200);
ADVTABLE_I VARCHAR2(350);
PTNAME VARCHAR2(200);
PARTSTRVARCHAR2(350);
FIRSTBOOLEAN;
DIMNAMEVARCHAR2(200);
PARTBY CLOB;
PARTNUMNUMBER;
LINENO NUMBER;
TYPE ADVCURTYP IS REF CURSOR;
ADV_CV ADVCURTYP;
BEGIN
ADVTABLE_I := ADVISE_TABLE_NAME(ADVTABLE);
DBMS_LOB.CREATETEMPORARY(OUTPUT, FALSE);
EXECUTE IMMEDIATE 'SELECT MAX(partnum) FROM ' || ADVTABLE_I ||

' WHERE cubename=:1'
INTO NPARTS USING CUBENAME;
IF NPARTS > 1 THEN
IF SPARSENAME IS NULL THEN
SPARSENAME_I := CUBENAME || '_dim';
ELSE
SPARSENAME_I := SPARSENAME;
END IF;
PTNAME := TEMPLATENAME(CUBENAME);
DBMS_LOB.OPEN(OUTPUT, DBMS_LOB.LOB_READWRITE);
FOR PARTNUM IN 1..NPARTS LOOP
IF PARTNUM > 1 THEN

LOB_STRINGAPPEND(OUTPUT, ENDLN);
END IF;
CUBEDEF := ADVISE_DIMENSIONALITY(CUBENAME, SPARSEDEF,

PARTNAME(SPARSENAME_I, PARTNUM),

PARTNUM, ADVTABLE);
IF SPARSEDEF IS NOT NULL THEN

LOB_STRINGAPPEND(OUTPUT, SPARSEDEF);
END IF;
END LOOP;
LOB_STRINGAPPEND(OUTPUT, ENDLN);
LOB_STRINGAPPEND(OUTPUT, 'DEFINE ' || PTNAME || ' PARTITION TEMPLATE-' || ENDLN);
LOB_STRINGAPPEND(OUTPUT, 'PARTITION BY LIST (');
FIRST := TRUE;
OPEN ADV_CV
FOR 'SELECT dimension, partnum FROM ' || ADVTABLE_I ||

' WHERE cubename=:1 AND partby IS NOT NULL' ||

' ORDER BY partnum'
USING CUBENAME;
LOOP
FETCH ADV_CV INTO DIMNAME, PARTNUM;
EXIT WHEN ADV_CV%NOTFOUND;
IF FIRST THEN

FIRST := FALSE;

LOB_STRINGAPPEND(OUTPUT, DIMNAME || ') -' || ENDLN);

LOB_STRINGAPPEND(OUTPUT, ' (');
ELSE

LOB_STRINGAPPEND(OUTPUT, ' -' || ENDLN || '');
END IF;
PARTSTR := PARTNAME(SPARSENAME_I, PARTNUM);
CUBEDEF := ADVISE_DIMENSIONALITY(CUBENAME, SPARSEDEF, PARTSTR,

PARTNUM, ADVTABLE);
CUBEDEF := REGEXP_REPLACE(CUBEDEF, PARTSTR || ']*>',

PARTSTR || '');
LOB_STRINGAPPEND(OUTPUT, 'PARTITION p' || PARTNUM ||

' VALUES () ' || CUBEDEF);
END LOOP;
LOB_STRINGAPPEND(OUTPUT, ')');
OPEN ADV_CV
FOR 'SELECT partnum, partby FROM ' || ADVTABLE_I ||

' WHERE cubename=:1 AND partby IS NOT NULL' ||

' ORDER BY partnum'
USING CUBENAME;
LOOP
FETCH ADV_CV INTO PARTNUM, PARTBY;
EXIT WHEN ADV_CV%NOTFOUND;
LOBLINEITER_INIT(LOBCTX, PARTBY, 32767);
LINENO := 0;
WHILE LOBLINEITER_NEXT(LOBCTX, CUBEDEF) LOOP

IF LENGTH(CUBEDEF) > 0 THEN

IF LINENO = 0 OR REMAINDER(LINENO, 16) = 0 THEN

LOB_STRINGAPPEND(OUTPUT, ENDLN || 'MAINTAIN ' || PTNAME ||

' MOVE TO PARTITION p' || PARTNUM ||

' -' || ENDLN || '');

ELSE

IF LINENO > 0 THEN

LOB_STRINGAPPEND(OUTPUT, ',');

END IF;

IF REMAINDER(LINENO, 4) = 0 THEN

LOB_STRINGAPPEND(OUTPUT, ' -' || ENDLN || '');

END IF;

END IF;

LOB_STRINGAPPEND(OUTPUT, ' ''' || CUBEDEF || '''');

LINENO := LINENO + 1;

END IF;
END LOOP;
END LOOP;
LOB_STRINGAPPEND(OUTPUT, ENDLN);
LOB_STRINGAPPEND(OUTPUT, 'DEFINE ' || CUBENAME || ' ' || DTYPE ||

' VARIABLE > -' || ENDLN);
FIRST := TRUE;
OPEN ADV_CV
FOR 'SELECT partnum FROM ' || ADVTABLE_I ||

' WHERE cubename=:1 AND partby IS NOT NULL' ||

' ORDER BY partnum'
USING CUBENAME;
LOOP
FETCH ADV_CV INTO PARTNUM;
EXIT WHEN ADV_CV%NOTFOUND;
IF FIRST THEN

FIRST := FALSE;

LOB_STRINGAPPEND(OUTPUT, '(');
ELSE

LOB_STRINGAPPEND(OUTPUT, ', -' || ENDLN || ' ');
END IF;
LOB_STRINGAPPEND(OUTPUT, 'PARTITION p' || PARTNUM || ' INTERNAL');
END LOOP;
LOB_STRINGAPPEND(OUTPUT, ')');
DBMS_LOB.CLOSE(OUTPUT);
ELSE
CUBEDEF := ADVISE_DIMENSIONALITY(CUBENAME, SPARSEDEF, SPARSENAME,

ADVTABLE => ADVTABLE);
LOB_STRINGAPPEND(OUTPUT, SPARSEDEF || ENDLN);
LOB_STRINGAPPEND(OUTPUT, 'DEFINE ' || CUBENAME || ' ' || DTYPE ||

' VARIABLE ' || CUBEDEF);
END IF;
END ADVISE_DIMENSIONALITY;
FUNCTION ADVISE_PARTITIONING_DIMENSION(CUBENAME IN VARCHAR2,

DIMSOURCES IN DBMS_AW$_DIMENSION_SOURCES_T,

ADVTABLE IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
IS
ADVTABLE_I VARCHAR2(100);
PARTDIMVARCHAR2(100);
BEGIN
ADVTABLE_I := ADVISE_TABLE_NAME(ADVTABLE);
EXECUTE IMMEDIATE 'SELECT dimension FROM ' || ADVTABLE_I ||

' WHERE PARTBY IS NOT NULL AND partnum=1 and cubename=:1'
INTO PARTDIM USING CUBENAME;
RETURN PARTDIM;
END ADVISE_PARTITIONING_DIMENSION;
FUNCTION ADVISE_PARTITIONING_LEVEL(CUBENAME IN VARCHAR2,

DIMSOURCES IN DBMS_AW$_DIMENSION_SOURCES_T,

ADVTABLE IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
IS
ADVTABLE_I VARCHAR2(100);
PARTLEVELVARCHAR2(200);
PARTDIMVARCHAR2(100);
PARTTOPS CLOB;
PARTTOPVARCHAR2(100);
THISCOLVARCHAR2(100);
SRCVAL VARCHAR2(100);
LINECTXLOBLINEITER_T;
NFOUND NUMBER(10,0);
DIMSOURCEDBMS_AW$_DIMENSION_SOURCE_T;
BEGIN
ADVTABLE_I := ADVISE_TABLE_NAME(ADVTABLE);
EXECUTE IMMEDIATE 'SELECT partlevel from (SELECT partlevel, ROWNUM as ' ||
' rown FROM ' || ADVTABLE_I ||
' WHERE cubename=:1 AND partby IS NOT NULL) where rownTRUE);
END;
PROCEDURE AW_ATTACH( NAMEINVARCHAR2,

FORWRITEINBOOLEANDEFAULT FALSE,

CREATEAWINBOOLEANDEFAULT FALSE,

ATTARGS INVARCHAR2 DEFAULT NULL,

TBSPACE INVARCHAR2 DEFAULT NULL) IS
BEGIN
AW_ATTACH('', NAME, FORWRITE, CREATEAW, ATTARGS);
END;
PROCEDURE AW_ATTACH( SCHEMAINVARCHAR2,

NAMEINVARCHAR2,

FORWRITEINBOOLEANDEFAULT FALSE,

CREATEAWINBOOLEANDEFAULT FALSE,

ATTARGS INVARCHAR2 DEFAULT NULL,

TBSPACE INVARCHAR2 DEFAULT NULL)
IS
DBERR01EXCEPTION;
PRAGMA EXCEPTION_INIT(DBERR01, -33262);
RORW VARCHAR(2);
DBNAME VARCHAR2(80);
IATTARGS VARCHAR2(500);
BEGIN
DBNAME := GEN_DBNAME(SCHEMA, NAME);
IF FORWRITE THEN
RORW := 'RW';
ELSE
RORW := 'RO';
END IF;
BEGIN
IATTARGS := ' ' || RORW;
RUN('AW ATTACH ' || DBNAME || IATTARGS, SILENT => TRUE);
EXCEPTION
WHEN DBERR01 THEN BEGIN
IF NOT CREATEAW THEN RAISE; END IF;
AW_CREATE(SCHEMA, NAME, TBSPACE);
END;
END;
END;
PROCEDURE AW_DETACH( NAMEINVARCHAR2) IS
BEGIN
AW_DETACH('', NAME);
END;
PROCEDURE AW_DETACH( SCHEMAINVARCHAR2,

NAMEINVARCHAR2)
IS
DBNAME VARCHAR2(80);
BEGIN
DBNAME := GEN_DBNAME(SCHEMA, NAME);
RUN('AW DETACH ' || DBNAME, SILENT => TRUE);
END;
PROCEDURE AW_CREATE( NAMEINVARCHAR2,

TBSPACE INVARCHAR2 DEFAULT NULL,

PARTNUM IN NUMBER DEFAULT 8) IS
TBARGVARCHAR2(100);
BEGIN
IF TBSPACE IS NULL THEN
TBARG := '';
ELSE
TBARG := ' TABLESPACE ' || TBSPACE;
END IF;
RUN('AW CREATE ' || NAME || ' FIRST ' || TBARG ||
' PARTITIONS ' || PARTNUM, SILENT => TRUE);
END;
PROCEDURE AW_CREATE( SCHEMAINVARCHAR2,

NAMEINVARCHAR2,

TBSPACE INVARCHAR2 DEFAULT NULL)
IS
DBNAME VARCHAR2(80);
TBARGVARCHAR2(100);
BEGIN
DBNAME := GEN_DBNAME(SCHEMA, NAME);
IF TBSPACE IS NULL THEN
TBARG := '';
ELSE
TBARG := ' TABLESPACE ' || TBSPACE;
END IF;
RUN('AW CREATE ' || DBNAME || ' FIRST ' || TBARG, SILENT => TRUE);
END;
PROCEDURE AW_COPY(OLDNAME IN VARCHAR2,

NEWNAME IN VARCHAR2,

NEWTABLESPACE IN VARCHAR2 DEFAULT NULL,

PARTNUM IN NUMBER DEFAULT 8)
IS
BEGIN
AW_COPY('', OLDNAME, NEWNAME, NEWTABLESPACE, PARTNUM);
END;
PROCEDURE AW_COPY(OLDSCHEMA IN VARCHAR2,

OLDNAME IN VARCHAR2,

NEWNAME IN VARCHAR2,

NEWTABLESPACE IN VARCHAR2 DEFAULT NULL,

PARTNUM IN NUMBER DEFAULT 8)
IS
COPYLOBS DBMS_AW.EIF_T;
BEGIN

IF NEWTABLESPACE IS NULL THEN
RUN('aw create '||NEWNAME || ' partitions ' || PARTNUM, SILENT => TRUE);
ELSE
RUN('aw create '||NEWNAME || ' partitions ' || PARTNUM
|| ' tablespace ' || NEWTABLESPACE, SILENT => TRUE);
END IF;

EIF_OUT(OLDSCHEMA, OLDNAME, COPYLOBS);
AW_DETACH(OLDSCHEMA, OLDNAME);

EIF_IN(NEWNAME, COPYLOBS);

EIF_DELETE(COPYLOBS);
RUN('update '||NEWNAME, SILENT => TRUE);
EXCEPTION
WHEN OTHERS THEN BEGIN
AW_DETACH(OLDSCHEMA, OLDNAME);
AW_DETACH(NEWNAME);
AW_DELETE(NEWNAME);
RAISE;
END;
END;

PROCEDURE AW_DELETE( NAMEINVARCHAR2) IS
BEGIN
AW_DELETE('', NAME);
END;

PROCEDURE AW_DELETE( SCHEMAINVARCHAR2,

NAMEINVARCHAR2)
IS
DBNAME VARCHAR2(80);
TBARGVARCHAR2(100);
BEGIN
DBNAME := GEN_DBNAME(SCHEMA, NAME);
RUN('AW DELETE ' || DBNAME, SILENT => TRUE);
END;

PROCEDURE INT_AW_RENAME(INNAMEIN VARCHAR2,

OUTNAME IN VARCHAR2) IS
EXTERNAL NAME "xsawRename"
WITH CONTEXT
PARAMETERS(CONTEXT, INNAME, OUTNAME)
LIBRARY DBMS_AW_LIB;
PROCEDURE AW_RENAME( INNAMEIN VARCHAR2,

OUTNAME IN VARCHAR2)
IS
NEW_IN VARCHAR2(400);
NEW_OUT VARCHAR2(400);
BEGIN

IF INNAME IS NULL OR (INNAME = '') OR OUTNAME IS NULL OR (OUTNAME = '') THEN
RAISE_APPLICATION_ERROR(AWNAME_NULL_ERROR,
'AW name cannot be NULL.');
END IF;

NEW_IN := DBMS_ASSERT.SIMPLE_SQL_NAME(UPPER(INNAME));
NEW_OUT := DBMS_ASSERT.SIMPLE_SQL_NAME(UPPER(OUTNAME));
INT_AW_RENAME(NEW_IN, NEW_OUT);
END;
FUNCTIONAW_TABLESPACE(SCHEMA IN VARCHAR2,

NAME IN VARCHAR2)
RETURN VARCHAR2 AS
TBLNAME VARCHAR2(100);
TBSPVARCHAR2(100);
PARTVARCHAR2(3);
BEGIN
TBLNAME := 'AW$'||UPPER(NAME);
SELECT TABLESPACE_NAME, PARTITIONED INTO TBSP, PART FROM ALL_TABLES
WHERE OWNER=SCHEMA AND TABLE_NAME=TBLNAME;



IF PART = 'YES' THEN
SELECT DEF_TABLESPACE_NAME INTO TBSP FROM ALL_PART_TABLES
WHERE OWNER=SCHEMA AND TABLE_NAME=TBLNAME;
END IF;
RETURN TBSP;
END AW_TABLESPACE;
FUNCTIONAW_TABLESPACE(NAME IN VARCHAR2)
RETURN VARCHAR2 AS
BEGIN
RETURN AW_TABLESPACE(USER, NAME);
END AW_TABLESPACE;



FUNCTIONINT_EIF_BLOB_OUT( SCHEMA IN VARCHAR2, NAME IN VARCHAR2,

OBJLISTIN EIF_OBJLIST_T DEFAULT NULL)
RETURN BLOB IS
EXTERNAL NAME "xseifExportBLOB"
WITH CONTEXT
PARAMETERS(CONTEXT, SCHEMA, NAME, OBJLIST)
LIBRARY DBMS_AW_LIB;
PROCEDURE INT_EIF_BLOB_IN(SCHEMA IN VARCHAR2,

NAME IN VARCHAR2,

IMPLOB IN BLOB,

DATADFNS IN BINARY_INTEGER DEFAULT EIFIMP_DATA,

OBJLISTIN EIF_OBJLIST_T DEFAULT NULL) IS
EXTERNAL NAME "xseifImportBLOB"
WITH CONTEXT
PARAMETERS(CONTEXT, SCHEMA, NAME, IMPLOB, DATADFNS SB4, OBJLIST)
LIBRARY DBMS_AW_LIB;
PROCEDURE INT_EIF_TABLE_OUT(SCHEMA IN VARCHAR2,

NAME IN VARCHAR2,

EXPTABLE OUT EIF_T,

OBJLISTIN EIF_OBJLIST_T DEFAULT NULL,

DFNS IN BOOLEAN DEFAULT FALSE) IS
EXTERNAL NAME "xseifExportTable"
WITH CONTEXT
PARAMETERS(CONTEXT, SCHEMA, NAME, EXPTABLE, OBJLIST, DFNS UB4)
LIBRARY DBMS_AW_LIB;
PROCEDURE INT_EIF_TABLE_IN( SCHEMA IN VARCHAR2,

NAME IN VARCHAR2,

IMPTABLE IN EIF_T,

DATADFNS IN BINARY_INTEGER DEFAULT EIFIMP_DATA,

OBJLISTIN EIF_OBJLIST_T DEFAULT NULL) IS
EXTERNAL NAME "xseifImportTable"
WITH CONTEXT
PARAMETERS(CONTEXT, SCHEMA, NAME, IMPTABLE, DATADFNS SB4, OBJLIST)
LIBRARY DBMS_AW_LIB;
PROCEDURE OCI_CLEAN IS
EXTERNAL NAME "xsociClean"
WITH CONTEXT
PARAMETERS(CONTEXT)
LIBRARY DBMS_AW_LIB;
FUNCTION PROP_VAL(RID IN ROWID)
RETURN VARCHAR2 IS
EXTERNAL NAME "xspgPValGet"
WITH CONTEXT
PARAMETERS(CONTEXT,

RID OCISTRING)
LIBRARY DBMS_AW_LIB;
FUNCTION XSPVALCLOB(RID IN ROWID, OUTLOB IN OUT NOCOPY CLOB)
RETURN BOOLEAN IS
EXTERNAL NAME "xspgPValClob"
WITH CONTEXT
PARAMETERS(CONTEXT,

RID OCISTRING,

OUTLOB)
LIBRARY DBMS_AW_LIB;
FUNCTION PROP_CLOB(RID IN ROWID)
RETURN CLOB AS
BEGIN
IF PROPLOB IS NULL THEN
DBMS_LOB.CREATETEMPORARY(PROPLOB, TRUE);
ELSE
DBMS_LOB.TRIM(PROPLOB, 0);
END IF;
IF XSPVALCLOB(RID, PROPLOB)
THEN
RETURN PROPLOB;
ELSE
RETURN NULL;
END IF;
END;
FUNCTION PROP_LEN(RID IN ROWID)
RETURN NUMBER IS
EXTERNAL NAME "xspgPValLen"
WITH CONTEXT
PARAMETERS(CONTEXT,

RID OCISTRING)
LIBRARY DBMS_AW_LIB;
FUNCTION OLAP_TYPE(OTYPE IN NUMBER)
RETURN VARCHAR2 IS
RETVAL VARCHAR2(20);
BEGIN
CASE OTYPE
WHEN1 THEN RETVAL := 'INTEGER';
WHEN2 THEN RETVAL := 'REAL';
WHEN3 THEN RETVAL := 'REALD';
WHEN4 THEN RETVAL := 'EXP_BOOL';
WHEN5 THEN RETVAL := 'IDN';
WHEN6 THEN RETVAL := 'EXP_CHAR';
WHEN7 THEN RETVAL := 'VSUB';
WHEN8 THEN RETVAL := 'INDXREC';
WHEN9 THEN RETVAL := 'SHINT';
WHEN 10 THEN RETVAL := 'VALUESET';
WHEN 11 THEN RETVAL := 'RAWTEXT';
WHEN 12 THEN RETVAL := 'WKSREC';
WHEN 13 THEN RETVAL := 'EXP_DATE';
WHEN 14 THEN RETVAL := 'EXP_NUMBER';
WHEN 15 THEN RETVAL := 'EXP_DATETIME';
WHEN 16 THEN RETVAL := 'EXP_LONGINT';
WHEN 17 THEN RETVAL := 'EXP_NTEXT';
WHEN 18 THEN RETVAL := 'DVPOSL';
WHEN -5 THEN RETVAL := 'NTEXTF';
WHEN -4 THEN RETVAL := 'BITBOOL';
WHEN -3 THEN RETVAL := 'TINYBOOL';
WHEN -2 THEN RETVAL := 'TINYINT';
WHEN -1 THEN RETVAL := 'CHARF';
ELSE RETVAL := 'NONE';
END CASE;
RETURN RETVAL;
END;
FUNCTION EIF_BLOB_OUT( NAMEINVARCHAR2,

OBJLIST INEIF_OBJLIST_T DEFAULT NULL)
RETURN BLOB IS
MYLOB BLOB;
BEGIN
RETURN EIF_BLOB_OUT('', NAME, OBJLIST);
END;
FUNCTION EIF_BLOB_OUT( SCHEMAINVARCHAR2,

NAMEINVARCHAR2,

OBJLIST INEIF_OBJLIST_T DEFAULT NULL)
RETURN BLOB IS
MYOBJS EIF_OBJLIST_T;
RETLOB BLOB;
BEGIN
IF OBJLIST IS NULL THEN
MYOBJS := EIF_OBJLIST_T();
ELSE
MYOBJS := OBJLIST;
END IF;
AW_ATTACH(SCHEMA, NAME);
RETLOB := INT_EIF_BLOB_OUT(SCHEMA, NAME, MYOBJS);
OCI_CLEAN();
RETURN RETLOB;
END;
PROCEDURE EIF_BLOB_IN( NAMEINVARCHAR2,

IMPLOBINBLOB,

DATADFNSINBINARY_INTEGER DEFAULT EIFIMP_DATA,

OBJLIST INEIF_OBJLIST_TDEFAULT NULL) IS
BEGIN
EIF_BLOB_IN('', NAME, IMPLOB, DATADFNS, OBJLIST);
END;
PROCEDURE EIF_BLOB_IN( SCHEMAINVARCHAR2,

NAMEINVARCHAR2,

IMPLOBINBLOB,

DATADFNSINBINARY_INTEGER DEFAULT EIFIMP_DATA,

OBJLIST INEIF_OBJLIST_TDEFAULT NULL)
IS
MYOBJS EIF_OBJLIST_T;
BEGIN
IF OBJLIST IS NULL THEN
MYOBJS := EIF_OBJLIST_T();
ELSE
MYOBJS := OBJLIST;
END IF;
AW_ATTACH(SCHEMA, NAME, TRUE, TRUE, 'noautogo');
INT_EIF_BLOB_IN(SCHEMA, NAME, IMPLOB, DATADFNS, MYOBJS);
END;
PROCEDURE EIF_OUT( NAMEINVARCHAR2,

EXPEIFOUT EIF_T,

OBJLIST INEIF_OBJLIST_T DEFAULT NULL,

DFNSINBOOLEAN DEFAULT FALSE) IS
BEGIN
EIF_OUT('', NAME, EXPEIF, OBJLIST, DFNS);
END;
PROCEDURE EIF_OUT( SCHEMAINVARCHAR2,

NAMEINVARCHAR2,

EXPEIFOUT EIF_T,

OBJLIST INEIF_OBJLIST_T DEFAULT NULL,

DFNSINBOOLEAN DEFAULT FALSE)
IS
MYOBJS EIF_OBJLIST_T;
BEGIN
IF OBJLIST IS NULL THEN
MYOBJS := EIF_OBJLIST_T();
ELSE
MYOBJS := OBJLIST;
END IF;
AW_ATTACH(SCHEMA, NAME);
INT_EIF_TABLE_OUT(SCHEMA, NAME, EXPEIF, MYOBJS, DFNS);
OCI_CLEAN();
END;
PROCEDURE EIF_IN(NAMEINVARCHAR2,

IMPEIFINEIF_T,

DATADFNSINBINARY_INTEGER DEFAULT EIFIMP_DATA,

OBJLIST INEIF_OBJLIST_TDEFAULT NULL) IS
BEGIN
EIF_IN('', NAME, IMPEIF, DATADFNS, OBJLIST);
END;
PROCEDURE EIF_IN(SCHEMAINVARCHAR2,

NAMEINVARCHAR2,

IMPEIFINEIF_T,

DATADFNSINBINARY_INTEGER DEFAULT EIFIMP_DATA,

OBJLIST INEIF_OBJLIST_TDEFAULT NULL)
IS
MYOBJS EIF_OBJLIST_T;
BEGIN
IF OBJLIST IS NULL THEN
MYOBJS := EIF_OBJLIST_T();
ELSE
MYOBJS := OBJLIST;
END IF;
AW_ATTACH(SCHEMA, NAME, TRUE, TRUE, 'noautogo');
INT_EIF_TABLE_IN(SCHEMA, NAME, IMPEIF, DATADFNS, MYOBJS);
END;
PROCEDURE EIF_DELETE(EIF IN OUT EIF_T) IS
BEGIN
IF EIF IS NULL THEN
RETURN;
END IF;
IF EIF.FIRST IS NULL OR EIF.LAST IS NULL THEN
EIF.DELETE();
RETURN;
END IF;
FOR I IN EIF.FIRST..EIF.LAST LOOP
DBMS_LOB.FREETEMPORARY(EIF(I));
END LOOP;
EIF.DELETE();
EIF.TRIM(EIF.COUNT);
END;
PROCEDURE MOVE_AWMETA(DEST_TBS IN VARCHAR2)
IS
NEW_TBS VARCHAR2(30);
TB_EXIST NUMBER;
CURSOR C1 IS SELECT AWNAME FROM AW$ WHERE AWSEQ#0 THEN
RAISE_APPLICATION_ERROR(HAS_SCHEMA_ERROR,

'Cannot specify schema when converting AW to same name.');
END IF;


IF EVAL_NUMBER(ATTSTR) = 1 AND EVAL_NUMBER(CHGSTR) = 1 THEN
RAISE_APPLICATION_ERROR(AW_CHANGED_ERROR,
'Cannot convert AW because it has been changed but not updated.');
END IF;

RUN('aw attach ' || UPNAME || ' rwx forcemode');
VERSTRING := EVAL_TEXT('aw(format)');

SAVEPOINT DBMS_AW_CONVERT_SP;
IF VERSTRING = '9' THEN
BEGIN
CONVERT(UPNAME, UPNAME);
EXCEPTION
WHEN OTHERS THEN

IF EVAL_NUMBER(ATTSTR) = 1 THEN

RUN('aw detach ' || UPNAME);

END IF;

RAISE;
END;
ELSE
BEGIN
XSAWUPGRADE(UPNAME);
RUN('aw detach ' || UPNAME);
EXCEPTION
WHEN OTHERS THEN

ROLLBACK TO DBMS_AW_CONVERT_SP;

RUN('aw detach ' || UPNAME);

RAISE;
END;
END IF;
COMMIT;
END;
PROCEDURE CONVERT (OLDNAME IN VARCHAR2,

NEWNAME IN VARCHAR2,

NEWTABLESPACE IN VARCHAR2 DEFAULT NULL) IS
COMPAT VARCHAR2(30);
MAJORVER NUMBER;
DOTPOS NUMBER;
UPOLDNAMEVARCHAR2(30);
UPNEWNAMEVARCHAR2(30);
TEMPNAME VARCHAR2(30);
OLDATTSTRVARCHAR2(100);
OLDCHGSTRVARCHAR2(100);
NEWATTSTRVARCHAR2(100);
TEMPATTSTR VARCHAR2(100);
BEGIN


SELECT VALUE INTO COMPAT FROM V$PARAMETER WHERE NAME = 'compatible';
DOTPOS := INSTR(COMPAT, '.');
MAJORVER := TO_NUMBER(SUBSTR(COMPAT, 1, DOTPOS-1));
IF MAJORVER0 THEN
RAISE_APPLICATION_ERROR(HAS_SCHEMA_ERROR,

'Cannot specify schema when converting AW to same name.');
END IF;
TEMPNAME := RTRIM(SUBSTR(UPOLDNAME, 0, 29)) || '_';
TEMPATTSTR := 'if aw(attached ''' || TEMPNAME || ''') then 1 else 0';
AW_COPY(OLDNAME=>UPOLDNAME, NEWNAME=>TEMPNAME, NEWTABLESPACE=>NEWTABLESPACE);
IF EVAL_NUMBER(OLDATTSTR) = 1 THEN

RUN('aw detach ' || UPOLDNAME);
END IF;
IF EVAL_NUMBER(TEMPATTSTR) = 1 THEN

RUN('aw detach ' || TEMPNAME);
END IF;
AW_DELETE(UPOLDNAME);
AW_RENAME(TEMPNAME, UPOLDNAME);
ELSE
AW_COPY(OLDNAME=>UPOLDNAME, NEWNAME=>UPNEWNAME, NEWTABLESPACE=>NEWTABLESPACE);
END IF;
EXCEPTION
WHEN OTHERS THEN

IF EVAL_NUMBER(OLDATTSTR) = 1 THEN

RUN('aw detach ' || UPOLDNAME);

END IF;

RAISE;
END;
IF EVAL_NUMBER(OLDATTSTR) = 1 THEN
RUN('aw detach ' || UPOLDNAME);
END IF;
IF EVAL_NUMBER(NEWATTSTR) = 1 THEN
RUN('aw detach ' || UPNEWNAME);
END IF;
COMMIT;
END;
PROCEDURE GATHER_STATS IS
BEGIN
DBMS_STATS.GATHER_TABLE_STATS('sys','aw_prop$',CASCADE=>TRUE);
DBMS_STATS.GATHER_TABLE_STATS('sys','aw$',CASCADE=>TRUE);
DBMS_STATS.GATHER_TABLE_STATS('sys','aw_obj$',CASCADE=>TRUE);
DBMS_STATS.GATHER_TABLE_STATS('sys','ps$',CASCADE=>TRUE);
END;
FUNCTION GET_OBJ_PROTECT
RETURN BOOLEAN IS
EXTERNAL NAME "xsSmplGetObjProtect"
LIBRARY DBMS_AW_LIB;
PROCEDURE SET_OBJ_PROTECT(VAL IN BOOLEAN) IS
EXTERNAL NAME "xsSmplSetObjProtect"
PARAMETERS(VAL)
LIBRARY DBMS_AW_LIB;

END DBMS_AW;
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
利用http://www.itpub.net/viewthread. ... p;extra=&page=6
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
aix上dba_source也有相同的text内容,难道是用户授权问题?
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
但是这个function找不到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行