Hi,
I have not found any function to do what you need, but if you've developed a procedure using arrays you do, watch it and tell me if you need.
Regards.
DROP TABLE TBL_TEST;
CREATE TABLE TBL_TEST (STATE nvarchar(100),CITY nvarchar(100));
INSERT INTO TBL_TEST values ('Arizona' ,'Phoenix');
INSERT INTO TBL_TEST values ('Arizona' ,'Mesa');
INSERT INTO TBL_TEST values ('Arizona' ,'Tempe');
INSERT INTO TBL_TEST values ('x' ,'x');
DROP PROCEDURE CONCATENATE_COLUMN;
CREATE PROCEDURE CONCATENATE_COLUMN() AS
BEGIN
DECLARE v_ID integer;
DECLARE v_STATE nvarchar(100);
DECLARE v_ACUM_STATE nvarchar(100) ARRAY;
DECLARE v_CITY nvarchar(100);
DECLARE v_ACUM_CITY nvarchar(100) ARRAY;
DECLARE v_LAST_STATE nvarchar(100);
DECLARE CURSOR c_cursor1 FOR
SELECT DENSE_RANK() OVER (ORDER BY STATE) as ID,STATE,CITY FROM TBL_TEST;
v_LAST_STATE := '';
FOR R AS c_cursor1 DO
v_ID := R.ID;
v_STATE := R.STATE;
v_CITY := R.CITY;
IF :v_LAST_STATE = '' THEN
v_LAST_STATE := :v_STATE;
v_ACUM_CITY[v_ID] := :v_CITY;
v_ACUM_STATE[v_ID] := :v_STATE;
ELSEIF :v_LAST_STATE <> :v_STATE THEN
v_LAST_STATE := v_STATE;
v_ACUM_CITY[v_ID] := :v_CITY;
v_ACUM_STATE[v_ID] := :v_STATE;
ELSE
v_ACUM_CITY[v_ID] := :v_ACUM_CITY[:v_ID] || ',' || :v_CITY;
END IF;
END FOR;
CLOSE c_cursor1;
v_table = UNNEST(:v_ACUM_STATE, :v_ACUM_CITY) AS ("STATE", "CITY");
SELECT * FROM :v_table;
END;
CALL CONCATENATE_COLUMN;