Вы можете использовать следующую ПРОЦЕДУРУ для создания динамического представления:
CREATE OR REPLACE PROCEDURE PROCESS_VW_DATA
IS
VVIEWCOLUMN VARCHAR2 (2000) DEFAULT '' ;
SQL_STMT1 VARCHAR2 (2000);
BEGIN
BEGIN
FOR C IN ( SELECT DISTINCT FUNCT
FROM ACCOUNT_FUNCTION
ORDER BY 1)
LOOP
VVIEWCOLUMN :=
VVIEWCOLUMN
|| ' '
|| 'MAX (DECODE (FUNCT, '
|| ''''
|| C.FUNCT
|| ''''
|| ', RESULT)) AS '
|| C.FUNCT
|| ', '
|| 'CASE WHEN MAX (DECODE (FUNCT, '
|| ''''
|| C.FUNCT
|| ''''
|| ', RESULT)) = ''Y'' AND UPPER('
|| ''''
|| C.FUNCT
|| ''''
|| ') = ''IS_LIVE'' THEN ''Active''
WHEN COALESCE(MAX (DECODE (FUNCT, '
|| ''''
|| C.FUNCT
|| ''''
|| ', RESULT)),''N'') = ''N'' AND UPPER('
|| ''''
|| C.FUNCT
|| ''''
|| ') = ''IS_LIVE'' THEN ''Inactive''
WHEN MAX (DECODE (FUNCT, '
|| ''''
|| C.FUNCT
|| ''''
|| ', RESULT)) = ''Y'' AND UPPER('
|| ''''
|| C.FUNCT
|| ''''
|| ') <> ''IS_LIVE'' THEN ''Yes''
ELSE ''No'' END AS '
|| C.FUNCT
|| '_VALUE'
|| ',';
END LOOP;
SELECT DISTINCT SUBSTR (VVIEWCOLUMN, 1, LENGTH (VVIEWCOLUMN) - 1)
INTO VVIEWCOLUMN
FROM DUAL;
END;
BEGIN
SQL_STMT1 :=
' CREATE OR REPLACE VIEW TEST_VIEW AS
SELECT AF.CLIENT,
AF.ACCT,
ACT.ACCT_NAME,'
|| VVIEWCOLUMN
|| '
FROM ACCOUNT_FUNCTION AF, ACCOUNT ACT
WHERE AF.ACCT = ACT.ACCT
GROUP BY AF.ACCT, AF.CLIENT, ACT.ACCT_NAME
ORDER BY 1';
EXECUTE IMMEDIATE SQL_STMT1;
END;
END PROCESS_VW_DATA;
Затем выполните процедуру:
EXEC PROCESS_VW_DATA
Теперь вы можете запустить нужный запрос:
SELECT * FROM TEST_VIEW WHERE CLIENT='OK'
Если вы хотите установить «Активный / Неактивный» в качестве статуса во время запроса, замените следующую часть процедуры
VVIEWCOLUMN :=
VVIEWCOLUMN
|| ' '
|| 'MAX (DECODE (FUNCT, '
|| ''''
|| C.FUNCT
|| ''''
|| ', RESULT)) AS '
|| C.FUNCT
|| ','
|| 'CASE WHEN MAX (DECODE (FUNCT, '
|| ''''
|| C.FUNCT
|| ''''
|| ', RESULT)) = ''Y'' THEN ''Yes'' ELSE ''No'' END AS '
|| C.FUNCT
|| '_VALUE ,';
Затем установите статус «Активный / Неактивный» в вашем запросе