CREATE OR REPLACE PACKAGE kscope_ptf AS
FUNCTION describe (p_tbl IN OUT DBMS_TF.TABLE_T,
p_cols DBMS_TF.COLUMNS_T )
RETURN DBMS_TF.DESCRIBE_T;
END;
CREATE OR REPLACE PACKAGE BODY kscope_ptf AS
FUNCTION describe (p_tbl IN OUT DBMS_TF.TABLE_T,
p_cols DBMS_TF.COLUMNS_T )
RETURN DBMS_TF.DESCRIBE_T IS
BEGIN
-- for every column in p_tbl...
FOR ocounter IN 1..p_tbl.column.count LOOP
-- set pass_through to FALSE
DBMS_OUTPUT.PUT_LINE('Object Column ' || p_tbl.column(ocounter).description.name);
p_tbl.column(ocounter).PASS_THROUGH := FALSE;
-- for every column in p_col1...
FOR rcounter IN 1..p_cols.count LOOP
-- If requested column matches existing column then pass it on through
IF UPPER(p_cols(rcounter)) = UPPER(p_tbl.column(ocounter).description.name) THEN
DBMS_OUTPUT.PUT_LINE('Requested Column ' || p_cols(rcounter));
p_tbl.column(ocounter).PASS_THROUGH := TRUE;
END IF;
END LOOP; -- ever column in p_col1
END LOOP; -- every column in p_tab
RETURN NULL;
END;
END;
CREATE OR REPLACE FUNCTION kscope_func(p_tbl IN TABLE, p_cols DBMS_TF.COLUMNS_T )
RETURN TABLE PIPELINED
ROW POLYMORPHIC USING kscope_ptf;
SELECT *
FROM kscope_func(kscope,COLUMNS(year))
SELECT *
FROM kscope_func(kscope,COLUMNS(year,city))
SELECT *
FROM kscope_func(kscope,COLUMNS(city,not_there))
SELECT *
FROM kscope_func(kscope,COLUMNS(not_there))
SELECT *
FROM kscope_func(kscope,COLUMNS(city,year))