Hi,
ich bring keine PL SQL funktion zusammen, die dynamisch den command code zusammenbaut um aus einer dynamischen table zu selecten. Hat jemand vielleicht eine Idee, wie man oracle dazu überzeugen kann?
Die Funktion soll dazu dienen, gegebene rows beim grouping in einen csv string umzuwandeln. Ohne dem dynamischen zusammenbasteln funkt's, aber ich mag nicht 15x else if, else if, etc. schreiben.
Code
CREATE OR REPLACE TYPE t_varchar2_column AS TABLE OF VARCHAR2(4000);
/
CREATE OR REPLACE
FUNCTION COLUMN_TO_STRING
(P_VARCHAR2_COLUMN IN t_varchar2_column
,P_DELIMITER IN VARCHAR2 := ','
,P_FILTER IN VARCHAR2 := 'DISTINCT'
,P_SORT IN VARCHAR2 := 'ASC'
)
RETURN VARCHAR2
IS
l_string VARCHAR2(32767);
v_sorted_column t_varchar2_column;
v_command varchar2(4000);
BEGIN
-- check whether the column contains any values
IF p_varchar2_column.COUNT = 0 THEN
RETURN NULL;
END IF;
IF (p_filter = 'DISTINCT') THEN
-- select distinct values
v_command := 'SELECT DISTINCT *';
ELSE
-- select all values
v_command := 'SELECT *';
END IF;
v_command := v_command || ' BULK COLLECT INTO v_sorted_column';
v_command := v_command || ' FROM TABLE(p_varchar2_column) t';
IF (p_sort = 'ASC'
OR p_sort = 'DESC') THEN
-- add ORDER BY clause
v_command := v_command || ' ORDER BY 1 ' || p_sort;
END IF;
EXECUTE IMMEDIATE v_command;
-- loop through the column values
FOR i IN v_sorted_column.FIRST .. v_sorted_column.LAST LOOP
IF i != v_sorted_column.FIRST THEN
l_string := l_string || p_delimiter;
END IF;
l_string := l_string || v_sorted_column(i);
END LOOP;
RETURN l_string;
END column_to_string;
/
Alles anzeigen