Sql EN DBMS_TYPES.TYPECODE_CHAR当为180时,则 DBMS_TYPES.TYPECODE_时的时间戳181然后 DBMS_TYPES.TYPECODE_TIMESTAMP_TZ当231时,则 DBMS_TYPES.TYPECODE_T
EN DBMS_TYPES.TYPECODE_CHAR当为180时,则 DBMS_TYPES.TYPECODE_时的时间戳181然后 DBMS_TYPES.TYPECODE_TIMESTAMP_TZ当231时,则 DBMS_TYPES.TYPECODE_TIMESTAMP_LTZ DBMS_TYPES.TYPECODE_INTERVAL_YM当183时,则 DBMS_TYPES.TYPECODE_INTERVAL_DS END, 描述选项卡(NUMCOLS)。列精度, 描述选项卡(NUMCOLS)。颜色比例, CASE DESC_TAB(NUMCOLS)。当11然后18时键入COL_——对于rowid COL_max_len=16,并显示18个字符 ELSE DESC_TAB(NUMCOLS)。COL_MAX_LEN END, 描述选项卡(NUMCOLS).列字符集ID, 描述选项卡(NUMCOLS).COL\u字符集格式); 端环; 关闭RC; ATYP.ENDCREATE; BEGINCREATE(DBMS_TYPES.TYPECODE_表,RTYPE); RTYPE.SETINFO(空, 无效的 无效的 无效的 无效的 阿提普, DBMS_TYPES.TYPECODE_对象, 0); RTYPE.ENDCREATE(); 返回ODCICONST.SUCCESS; 例外情况 当其他人 返回ODCICONST.ERROR; 结束; -- 静态功能ODCITABLEPREPARE(SCTX输出数据透视输入, SYS.odcitabfUnsfo中的TI, VARCHAR2的P_STMT, VARCHAR2中的P_FMT:=“上(@P@)”, 数字为空)返回编号为 PREC PLS_整数; 比例PLS_整数; LEN PLS_整数; CSID PLS_整数; CSFRM PLS_整数; 任何类型的元素; 阿纳姆·瓦尔查尔2(30); TC PLS_整数; 开始 TC:=TI.RETTYPE.GETATTRELEMINFO(1, PREC, 规模 伦恩, 犯罪现场调查, CSFRM, 典型元素, 阿南); -- 如果INSTR(P_FMT,@P@')>0,则 SCTX:=PIVOTIMPL(元素类型,P_STMT,P_FMT,NULL); 其他的 SCTX:=PIVOTIMPL(元素类型,P STMT,@P@',NULL); 如果结束; 返回ODCICONST.SUCCESS; 结束; -- 静态功能ODCITABLESTART(SCTX输入输出数据透视输入, VARCHAR2的P_STMT, VARCHAR2中的P_FMT:=“上(@P@)”, 数字为空)返回编号为 CUR整数; NUMCOLS数; DESC_TAB DBMS_SQL.DESC_TAB2; T_STMT VARCHAR2(32767); 类型\代码PLS\整数; PREC PLS_整数; 比例PLS_整数; LEN PLS_整数; CSID PLS_整数; CSFRM PLS_整数; 模式名称VARCHAR2(30); 输入名称VARCHAR2(30); 版本2(30); 属性计数PLS\u整数; 属性类型ANYTYPE; 属性名称VARCHAR2(100); DUMMY2整数; 第一科瓦尔查2(30); 开始 CUR:=DBMS\u SQL.OPEN\u游标; PARSE(CUR,P_STMT,DBMS_SQL.NATIVE); DBMS_SQL.description_COLUMNS2(CUR、NUMCOLS、DESC_选项卡); DBMS_SQL.CLOSE_游标(CUR); -- 因为我在1。。NUMCOLS-2循环 T|STMT:=T|STMT | |',“| | DESC|u TAB(I).COL|u NAME |'”; 端环; -- 类型\代码:=SCTX.RET\类型.GETINFO(PREC, 规模 伦恩, 犯罪现场调查, CSFRM, 模式名称, 键入您的姓名, 版本 属性计数); 对于NUMCOLS中的I-1。。属性计数循环 类型\代码:=SCTX.RET\类型.GETATTRELEMINFO(I, PREC, 规模 伦恩, 犯罪现场调查, CSFRM, 属性类型, 属性名称); T_STMT:=T_STMT|| 替换(”,最大值(解码(“| | | SCTX.FMT | |,”)|| 属性名称、描述选项卡(NUMCOLS) .COL|u NAME | |')', "p",, 描述选项卡(NUMCOLS-1).COL\u名称); 端环; T|STMT:=“从(“|SCTX.STMT|”)中选择“|SUBSTR(T|STMT,2)|”; 因为我在1。。NUMCOLS-2循环 如果I=1,那么 T|STMT:=T|STMT||“分组依据”| | DESC|u TAB(I).COL|u NAME |“; 第一列:=描述选项卡(I).列名称; 其他的 T|STMT:=T|STMT | |',“| | DESC|u TAB(I).COL|u NAME |'”; 如果结束; 端环; T|STMT:=T|STMT|||'ORDER BY'| | | FIRST| | | |''; -- DBMS_OUTPUT.PUT_LINE(T_STMT); SCTX.CUR:=DBMS\u SQL.OPEN\u游标; DBMS_SQL.PARSE(SCTX.CUR、T_STMT、DBMS_SQL.NATIVE); 因为我在1。。属性计数循环 类型\代码:=SCTX.RET\类型.GETATTRELEMINFO(I, PREC, 规模 伦恩, 犯罪现场调查, CSFRM, 属性类型, 属性名称); 案例类型代码 当DBMS_TYPES.TYPECODE_CHAR DBMS_SQL.DEFINE_列(SCTX.CUR,I,'x',32767); 当DBMS_TYPES.TYPECODE_VARCHAR2 DBMS_SQL.DEFINE_列(SCTX.CUR,I,'x',32767); 当DBMS_键入.TYPECODE_编号时 DBMS_SQL.DEFINE_列(SCTX.CUR,I,Sql EN DBMS_TYPES.TYPECODE_CHAR当为180时,则 DBMS_TYPES.TYPECODE_时的时间戳181然后 DBMS_TYPES.TYPECODE_TIMESTAMP_TZ当231时,则 DBMS_TYPES.TYPECODE_T,sql,oracle,plsql,oracle10g,Sql,Oracle,Plsql,Oracle10g,EN DBMS_TYPES.TYPECODE_CHAR当为180时,则 DBMS_TYPES.TYPECODE_时的时间戳181然后 DBMS_TYPES.TYPECODE_TIMESTAMP_TZ当231时,则 DBMS_TYPES.TYPECODE_TIMESTAMP_LTZ DBMS_TYPES.TYPECODE_INTERVAL_YM当183时,则 DBMS_TYPES.TYPECODE_INTERVAL_DS END, 描述选项卡(NUMCOLS)。列精度, 描述选项卡(NUMCOLS
SELECT
R.ID_REQUEST, R.ID_PROJET, J.NAME, L.DATE_ACTION,L.NAME_ACTION
, LEAD(L.DATE_ACTION) OVER (PARTITION BY R.ID_REQUEST ORDER BY L.DATE_ACTION)- L.DATE_ACTION AS TOTAL_DAYS
FROM (REQUEST R LEFT JOIN LOG_TABLE L ON R.ID_REQUEST = L.ID_REQUEST)
LEFT JOIN JOB_TABLE J ON R.ID_JOB = J.ID_JOB
WHERE D.ID_REQUEST = 10
ID_REQUEST ID_PROJET NAME DATE_ACTION NAME_ACTION TOTAL_DAYS
10 152 pr1 01/01/2005 arbitrary_name1 3
10 152 pr1 04/01/2005 arbitrary_name2 1
10 152 pr1 05/01/2005 arbitrary_name3 null
SELECT *
FROM TABLE(DYNAMIC_PIVOT(
'SELECT emp_no,dept_no from emp group by emp_no'));
CREATE OR REPLACE TYPE PIVOTIMPL AS OBJECT
(
--from here https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/
RET_TYPE ANYTYPE, -- The return type of the table function
STMT VARCHAR2(32767),
FMT VARCHAR2(32767),
CUR INTEGER,
STATIC FUNCTION ODCITABLEDESCRIBE(RTYPE OUT ANYTYPE,
P_STMT IN VARCHAR2,
P_FMT IN VARCHAR2 := 'upper(@p@)',
DUMMY IN NUMBER := 0) RETURN NUMBER,
STATIC FUNCTION ODCITABLEPREPARE(SCTX OUT PIVOTIMPL,
TI IN SYS.ODCITABFUNCINFO,
P_STMT IN VARCHAR2,
P_FMT IN VARCHAR2 := 'upper(@p@)',
DUMMY IN NUMBER := 0) RETURN NUMBER,
STATIC FUNCTION ODCITABLESTART(SCTX IN OUT PIVOTIMPL,
P_STMT IN VARCHAR2,
P_FMT IN VARCHAR2 := 'upper(@p@)',
DUMMY IN NUMBER := 0) RETURN NUMBER,
MEMBER FUNCTION ODCITABLEFETCH(SELF IN OUT PIVOTIMPL,
NROWS IN NUMBER,
OUTSET OUT ANYDATASET) RETURN NUMBER,
MEMBER FUNCTION ODCITABLECLOSE(SELF IN PIVOTIMPL) RETURN NUMBER
)
/
prompt
prompt Creating function DYNAMIC_PIVOT
prompt ===============================
prompt
CREATE OR REPLACE FUNCTION BROO1APP.DYNAMIC_PIVOT(P_STMT IN VARCHAR2,
P_FMT IN VARCHAR2 := 'upper(@p@)',
DUMMY IN NUMBER := 0)
RETURN ANYDATASET
PIPELINED USING PIVOTIMPL;
/
prompt
prompt Creating type body PIVOTIMPL
prompt ============================
prompt
CREATE OR REPLACE TYPE BODY BROO1APP.PIVOTIMPL AS
STATIC FUNCTION ODCITABLEDESCRIBE(RTYPE OUT ANYTYPE,
P_STMT IN VARCHAR2,
P_FMT IN VARCHAR2 := 'upper(@p@)',
DUMMY IN NUMBER) RETURN NUMBER IS
ATYP ANYTYPE;
CUR INTEGER;
NUMCOLS NUMBER;
DESC_TAB DBMS_SQL.DESC_TAB2;
RC SYS_REFCURSOR;
T_C2 VARCHAR2(32767);
T_FMT VARCHAR2(1000);
BEGIN
CUR := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(CUR, P_STMT, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS2(CUR, NUMCOLS, DESC_TAB);
DBMS_SQL.CLOSE_CURSOR(CUR);
--
ANYTYPE.BEGINCREATE(DBMS_TYPES.TYPECODE_OBJECT, ATYP);
FOR I IN 1 .. NUMCOLS - 2 LOOP
ATYP.ADDATTR(DESC_TAB(I).COL_NAME,
CASE DESC_TAB(I).COL_TYPE
WHEN 1 THEN
DBMS_TYPES.TYPECODE_VARCHAR2
WHEN 2 THEN
DBMS_TYPES.TYPECODE_NUMBER
WHEN 9 THEN
DBMS_TYPES.TYPECODE_VARCHAR2
WHEN 11 THEN
DBMS_TYPES.TYPECODE_VARCHAR2 -- show rowid as varchar2
WHEN 12 THEN
DBMS_TYPES.TYPECODE_DATE
WHEN 208 THEN
DBMS_TYPES.TYPECODE_VARCHAR2 -- show urowid as varchar2
WHEN 96 THEN
DBMS_TYPES.TYPECODE_CHAR
WHEN 180 THEN
DBMS_TYPES.TYPECODE_TIMESTAMP
WHEN 181 THEN
DBMS_TYPES.TYPECODE_TIMESTAMP_TZ
WHEN 231 THEN
DBMS_TYPES.TYPECODE_TIMESTAMP_LTZ
WHEN 182 THEN
DBMS_TYPES.TYPECODE_INTERVAL_YM
WHEN 183 THEN
DBMS_TYPES.TYPECODE_INTERVAL_DS
END,
DESC_TAB(I).COL_PRECISION,
DESC_TAB(I).COL_SCALE,
CASE DESC_TAB(I).COL_TYPE
WHEN 11 THEN
18 -- for rowid col_max_len = 16, and 18 characters are shown
ELSE
DESC_TAB(I).COL_MAX_LEN
END,
DESC_TAB(I).COL_CHARSETID,
DESC_TAB(I).COL_CHARSETFORM);
END LOOP;
IF INSTR(P_FMT, '@p@') > 0 THEN
T_FMT := P_FMT;
ELSE
T_FMT := '@p@';
END IF;
OPEN RC FOR REPLACE('select distinct ' || T_FMT || '
from( ' || P_STMT || ' )
order by ' || T_FMT,
'@p@',
DESC_TAB(NUMCOLS - 1).COL_NAME);
LOOP
FETCH RC
INTO T_C2;
EXIT WHEN RC%NOTFOUND;
ATYP.ADDATTR(T_C2,
CASE DESC_TAB(NUMCOLS).COL_TYPE WHEN 1 THEN
DBMS_TYPES.TYPECODE_VARCHAR2 WHEN 2 THEN
DBMS_TYPES.TYPECODE_NUMBER WHEN 9 THEN
DBMS_TYPES.TYPECODE_VARCHAR2 WHEN 11 THEN
DBMS_TYPES.TYPECODE_VARCHAR2 -- show rowid as varchar2
WHEN 12 THEN DBMS_TYPES.TYPECODE_DATE WHEN 208 THEN
DBMS_TYPES.TYPECODE_UROWID WHEN 96 THEN
DBMS_TYPES.TYPECODE_CHAR WHEN 180 THEN
DBMS_TYPES.TYPECODE_TIMESTAMP WHEN 181 THEN
DBMS_TYPES.TYPECODE_TIMESTAMP_TZ WHEN 231 THEN
DBMS_TYPES.TYPECODE_TIMESTAMP_LTZ WHEN 182 THEN
DBMS_TYPES.TYPECODE_INTERVAL_YM WHEN 183 THEN
DBMS_TYPES.TYPECODE_INTERVAL_DS END,
DESC_TAB(NUMCOLS).COL_PRECISION,
DESC_TAB(NUMCOLS).COL_SCALE,
CASE DESC_TAB(NUMCOLS).COL_TYPE WHEN 11 THEN 18 -- for rowid col_max_len = 16, and 18 characters are shown
ELSE DESC_TAB(NUMCOLS).COL_MAX_LEN END,
DESC_TAB(NUMCOLS).COL_CHARSETID,
DESC_TAB(NUMCOLS).COL_CHARSETFORM);
END LOOP;
CLOSE RC;
ATYP.ENDCREATE;
ANYTYPE.BEGINCREATE(DBMS_TYPES.TYPECODE_TABLE, RTYPE);
RTYPE.SETINFO(NULL,
NULL,
NULL,
NULL,
NULL,
ATYP,
DBMS_TYPES.TYPECODE_OBJECT,
0);
RTYPE.ENDCREATE();
RETURN ODCICONST.SUCCESS;
EXCEPTION
WHEN OTHERS THEN
RETURN ODCICONST.ERROR;
END;
--
STATIC FUNCTION ODCITABLEPREPARE(SCTX OUT PIVOTIMPL,
TI IN SYS.ODCITABFUNCINFO,
P_STMT IN VARCHAR2,
P_FMT IN VARCHAR2 := 'upper(@p@)',
DUMMY IN NUMBER) RETURN NUMBER IS
PREC PLS_INTEGER;
SCALE PLS_INTEGER;
LEN PLS_INTEGER;
CSID PLS_INTEGER;
CSFRM PLS_INTEGER;
ELEM_TYP ANYTYPE;
ANAME VARCHAR2(30);
TC PLS_INTEGER;
BEGIN
TC := TI.RETTYPE.GETATTRELEMINFO(1,
PREC,
SCALE,
LEN,
CSID,
CSFRM,
ELEM_TYP,
ANAME);
--
IF INSTR(P_FMT, '@p@') > 0 THEN
SCTX := PIVOTIMPL(ELEM_TYP, P_STMT, P_FMT, NULL);
ELSE
SCTX := PIVOTIMPL(ELEM_TYP, P_STMT, '@p@', NULL);
END IF;
RETURN ODCICONST.SUCCESS;
END;
--
STATIC FUNCTION ODCITABLESTART(SCTX IN OUT PIVOTIMPL,
P_STMT IN VARCHAR2,
P_FMT IN VARCHAR2 := 'upper(@p@)',
DUMMY IN NUMBER) RETURN NUMBER IS
CUR INTEGER;
NUMCOLS NUMBER;
DESC_TAB DBMS_SQL.DESC_TAB2;
T_STMT VARCHAR2(32767);
TYPE_CODE PLS_INTEGER;
PREC PLS_INTEGER;
SCALE PLS_INTEGER;
LEN PLS_INTEGER;
CSID PLS_INTEGER;
CSFRM PLS_INTEGER;
SCHEMA_NAME VARCHAR2(30);
TYPE_NAME VARCHAR2(30);
VERSION VARCHAR2(30);
ATTR_COUNT PLS_INTEGER;
ATTR_TYPE ANYTYPE;
ATTR_NAME VARCHAR2(100);
DUMMY2 INTEGER;
FIRST_COL VARCHAR2(30);
BEGIN
CUR := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(CUR, P_STMT, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS2(CUR, NUMCOLS, DESC_TAB);
DBMS_SQL.CLOSE_CURSOR(CUR);
--
FOR I IN 1 .. NUMCOLS - 2 LOOP
T_STMT := T_STMT || ', "' || DESC_TAB(I).COL_NAME || '"';
END LOOP;
--
TYPE_CODE := SCTX.RET_TYPE.GETINFO(PREC,
SCALE,
LEN,
CSID,
CSFRM,
SCHEMA_NAME,
TYPE_NAME,
VERSION,
ATTR_COUNT);
FOR I IN NUMCOLS - 1 .. ATTR_COUNT LOOP
TYPE_CODE := SCTX.RET_TYPE.GETATTRELEMINFO(I,
PREC,
SCALE,
LEN,
CSID,
CSFRM,
ATTR_TYPE,
ATTR_NAME);
T_STMT := T_STMT ||
REPLACE(', max( decode( ' || SCTX.FMT || ', ''' ||
ATTR_NAME || ''', ' || DESC_TAB(NUMCOLS)
.COL_NAME || ' ) )',
'@p@',
DESC_TAB(NUMCOLS - 1).COL_NAME);
END LOOP;
T_STMT := 'select ' || SUBSTR(T_STMT, 2) || ' from ( ' || SCTX.STMT || ' )';
FOR I IN 1 .. NUMCOLS - 2 LOOP
IF I = 1 THEN
T_STMT := T_STMT || ' group by "' || DESC_TAB(I).COL_NAME || '"';
FIRST_COL := DESC_TAB(I).COL_NAME;
ELSE
T_STMT := T_STMT || ', "' || DESC_TAB(I).COL_NAME || '"';
END IF;
END LOOP;
T_STMT := T_STMT || ' ORDER BY "' || FIRST_COL || '"';
--
DBMS_OUTPUT.PUT_LINE(T_STMT);
SCTX.CUR := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(SCTX.CUR, T_STMT, DBMS_SQL.NATIVE);
FOR I IN 1 .. ATTR_COUNT LOOP
TYPE_CODE := SCTX.RET_TYPE.GETATTRELEMINFO(I,
PREC,
SCALE,
LEN,
CSID,
CSFRM,
ATTR_TYPE,
ATTR_NAME);
CASE TYPE_CODE
WHEN DBMS_TYPES.TYPECODE_CHAR THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR, I, 'x', 32767);
WHEN DBMS_TYPES.TYPECODE_VARCHAR2 THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR, I, 'x', 32767);
WHEN DBMS_TYPES.TYPECODE_NUMBER THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR, I, CAST(NULL AS NUMBER));
WHEN DBMS_TYPES.TYPECODE_DATE THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR, I, CAST(NULL AS DATE));
WHEN DBMS_TYPES.TYPECODE_UROWID THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR, I, CAST(NULL AS UROWID));
WHEN DBMS_TYPES.TYPECODE_TIMESTAMP THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR, I, CAST(NULL AS TIMESTAMP));
WHEN DBMS_TYPES.TYPECODE_TIMESTAMP_TZ THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR, I, CAST(NULL AS TIMESTAMP WITH TIME ZONE));
WHEN DBMS_TYPES.TYPECODE_TIMESTAMP_LTZ THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR, I, CAST(NULL AS TIMESTAMP WITH LOCAL TIME ZONE));
WHEN DBMS_TYPES.TYPECODE_INTERVAL_YM THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR,
I,
CAST(NULL AS INTERVAL YEAR TO MONTH));
WHEN DBMS_TYPES.TYPECODE_INTERVAL_DS THEN
DBMS_SQL.DEFINE_COLUMN(SCTX.CUR,
I,
CAST(NULL AS INTERVAL DAY TO SECOND));
END CASE;
END LOOP;
DUMMY2 := DBMS_SQL.EXECUTE(SCTX.CUR);
RETURN ODCICONST.SUCCESS;
END;
--
MEMBER FUNCTION ODCITABLEFETCH(SELF IN OUT PIVOTIMPL,
NROWS IN NUMBER,
OUTSET OUT ANYDATASET) RETURN NUMBER IS
C1_COL_TYPE PLS_INTEGER;
TYPE_CODE PLS_INTEGER;
PREC PLS_INTEGER;
SCALE PLS_INTEGER;
LEN PLS_INTEGER;
CSID PLS_INTEGER;
CSFRM PLS_INTEGER;
SCHEMA_NAME VARCHAR2(30);
TYPE_NAME VARCHAR2(30);
VERSION VARCHAR2(30);
ATTR_COUNT PLS_INTEGER;
ATTR_TYPE ANYTYPE;
ATTR_NAME VARCHAR2(100);
V1 VARCHAR2(32767);
N1 NUMBER;
D1 DATE;
UR1 UROWID;
IDS1 INTERVAL DAY TO SECOND;
IYM1 INTERVAL YEAR TO MONTH;
TS1 TIMESTAMP;
TSTZ1 TIMESTAMP WITH TIME ZONE;
TSLTZ1 TIMESTAMP WITH LOCAL TIME ZONE;
BEGIN
OUTSET := NULL;
IF NROWS < 1 THEN
-- is this possible???
RETURN ODCICONST.SUCCESS;
END IF;
--
DBMS_OUTPUT.PUT_LINE('fetch');
IF DBMS_SQL.FETCH_ROWS(SELF.CUR) = 0 THEN
RETURN ODCICONST.SUCCESS;
END IF;
--
DBMS_OUTPUT.PUT_LINE('done');
TYPE_CODE := SELF.RET_TYPE.GETINFO(PREC,
SCALE,
LEN,
CSID,
CSFRM,
SCHEMA_NAME,
TYPE_NAME,
VERSION,
ATTR_COUNT);
ANYDATASET.BEGINCREATE(DBMS_TYPES.TYPECODE_OBJECT,
SELF.RET_TYPE,
OUTSET);
OUTSET.ADDINSTANCE;
OUTSET.PIECEWISE();
FOR I IN 1 .. ATTR_COUNT LOOP
TYPE_CODE := SELF.RET_TYPE.GETATTRELEMINFO(I,
PREC,
SCALE,
LEN,
CSID,
CSFRM,
ATTR_TYPE,
ATTR_NAME);
DBMS_OUTPUT.PUT_LINE(ATTR_NAME);
CASE TYPE_CODE
WHEN DBMS_TYPES.TYPECODE_CHAR THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, V1);
OUTSET.SETCHAR(V1);
WHEN DBMS_TYPES.TYPECODE_VARCHAR2 THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, V1);
OUTSET.SETVARCHAR2(V1);
WHEN DBMS_TYPES.TYPECODE_NUMBER THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, N1);
OUTSET.SETNUMBER(N1);
WHEN DBMS_TYPES.TYPECODE_DATE THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, D1);
OUTSET.SETDATE(D1);
WHEN DBMS_TYPES.TYPECODE_UROWID THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, UR1);
OUTSET.SETUROWID(UR1);
WHEN DBMS_TYPES.TYPECODE_INTERVAL_DS THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, IDS1);
OUTSET.SETINTERVALDS(IDS1);
WHEN DBMS_TYPES.TYPECODE_INTERVAL_YM THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, IYM1);
OUTSET.SETINTERVALYM(IYM1);
WHEN DBMS_TYPES.TYPECODE_TIMESTAMP THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, TS1);
OUTSET.SETTIMESTAMP(TS1);
WHEN DBMS_TYPES.TYPECODE_TIMESTAMP_TZ THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, TSTZ1);
OUTSET.SETTIMESTAMPTZ(TSTZ1);
WHEN DBMS_TYPES.TYPECODE_TIMESTAMP_LTZ THEN
DBMS_SQL.COLUMN_VALUE(SELF.CUR, I, TSLTZ1);
OUTSET.SETTIMESTAMPLTZ(TSLTZ1);
END CASE;
END LOOP;
OUTSET.ENDCREATE;
RETURN ODCICONST.SUCCESS;
END;
--
MEMBER FUNCTION ODCITABLECLOSE(SELF IN PIVOTIMPL) RETURN NUMBER IS
C INTEGER;
BEGIN
C := SELF.CUR;
DBMS_SQL.CLOSE_CURSOR(C);
RETURN ODCICONST.SUCCESS;
END;
END;
/