Я попытался использовать защищенный SQL-скрипт, используя this link, но когда динамические переменные связывания становятся все больше и больше, код кажется неуклюжим. Пожалуйста, проверьте этот код и дайте идею уменьшить сложность.Oracle Безопасное использование SQL-скрипта
На основе приведенного ниже кода вы можете увидеть эти три переменные (ZONE_CODE_STR, ACTIVE_STR и LOGICAL_ENV_STR) в качестве параметров для запроса, когда значение приходит, я использую их или заменяю их пустой строкой. Но проблема заключается в том, что я хотите добавить еще один параметр, логика IF-ELSE становится слишком сложной. Пожалуйста, помогите мне найти простой способ достичь, если я хочу добавить еще одну новую динамическую переменную.
Пример кода:
-- APPLICATION VARIABLES STARTS HERE
ZONE_CODE_STR VARCHAR2(100);
ZONE_CODE_FLAG VARCHAR2(20);
ACTIVE_STR VARCHAR2(100);
ACTIVE_FLAG VARCHAR2(20);
LOGICAL_ENV_STR VARCHAR2(100);
LOGICAL_ENV_FLAG VARCHAR2(20);
QUERY_STR VARCHAR2(4000);
-- APPLICATION VARIABLES END HERE
BEGIN
-- APPLICATION LOGIC STARTS HERE
ZONE_CODE_STR := ' AND ZONE_ENV_CODE IN (: IN_ZONE_ENV_CODE)';
ZONE_CODE_FLAG := '@@[email protected]@';
LOGICAL_ENV_STR := ' AND LOGICAL_DB_ENVIRONMENT.ZONE_ENV_CODE IN(: IN_ZONE_ENV_CODE)';
LOGICAL_ENV_FLAG := '@@[email protected]@';
ACTIVE_STR := ' AND ACTIVE =: IN_ACTIVE';
ACTIVE_FLAG := '@@[email protected]@';
QUERY_STR :='SELECT
RES_DETAIL.FRAME_NAME,RES_DETAIL.LISTENER_PORT,
RES_DETAIL.PROPERTY_NAME,RES_DETAIL.PROPERTY_VALUE,RES_DETAIL.IP_ADDRESS,
TEST_APP_ENTRIES.*,
TEST_APP_WEB_SERVER_TYPE.APP_WEB_SERVER_TYPE_NAME,
TEST_OPERATION_TYPE.OPERATION_TYPE_NAME,
TEST_SINGLE_SIGN_ON.SINGLE_SIGN_ON_NAME,TEST_APP_REALM_ENTRIES.WARE_ID,TEST_APP_REALM_ENTRIES.RESOURCE_FILTER,
TEST_APP_REALM_ENTRIES.PROTECTION_STATUS, TEST_APP_REALM_ENTRIES.AUTHENTICATION_TYPE_ID,
TEST_AUTHENTICATION_TYPE.AUTHENTICATION_TYPE_NAME,
TEST_APP_REALM_ENTRIES.ROLE
FROM
(
SELECT * FROM TEST_APP_ENTRIES WHERE APP_EXT_CODE =: IN_APP_EXT_CODE
@@[email protected]@
@@[email protected]@
)TEST_APP_ENTRIES
INNER JOIN
TEST_APP_REALM_ENTRIES
ON
TEST_APP_ENTRIES.WAE_ID = TEST_APP_REALM_ENTRIES.WAE_ID
INNER JOIN
TEST_OPERATION_TYPE
ON
TEST_APP_ENTRIES.OPERATION_TYPE_ID = TEST_OPERATION_TYPE.OPERATION_TYPE_ID
INNER JOIN
TEST_APP_WEB_SERVER_TYPE
ON
TEST_APP_ENTRIES.APP_WEB_SERVER_TYPE_ID = TEST_APP_WEB_SERVER_TYPE.APP_WEB_SERVER_TYPE_ID
INNER JOIN
TEST_SINGLE_SIGN_ON
ON
TEST_APP_ENTRIES.SINGLE_SIGN_ON_ID = TEST_SINGLE_SIGN_ON.SINGLE_SIGN_ON_ID
INNER JOIN
TEST_AUTHENTICATION_TYPE
ON
TEST_APP_REALM_ENTRIES.AUTHENTICATION_TYPE_ID = TEST_AUTHENTICATION_TYPE.AUTHENTICATION_TYPE_ID
RIGHT OUTER JOIN
(SELECT APP_FRAMES.LOGICAL_DB_ENV_NAME AS LOGICAL_DB_ENV_NAME,APP_FRAME_PROPERTIES.FRAME_NAME AS FRAME_NAME,APP_FRAME_PROPERTIES.APP_EXT_CODE AS APP_EXT_CODE,FRAMES.LISTENER_PORT AS LISTENER_PORT,
LOGICAL_DB_ENVIRONMENT.ZONE_ENV_CODE AS ZONE_ENV_CODE,
APP_FRAME_PROPERTIES.PROPERTY_NAME AS PROPERTY_NAME,APP_FRAME_PROPERTIES.PROPERTY_VALUE AS PROPERTY_VALUE,NODES.IP_ADDRESS AS IP_ADDRESS
FROM APP_FRAME_PROPERTIES,NODES,FRAMES,APP_FRAMES,LOGICAL_DB_ENVIRONMENT
WHERE APP_FRAME_PROPERTIES.FRAME_NAME = FRAMES.FRAME_NAME
AND APP_FRAME_PROPERTIES.APP_EXT_CODE = APP_FRAMES.APP_EXT_CODE
AND LOGICAL_DB_ENVIRONMENT.APP_EXT_CODE = APP_FRAMES.APP_EXT_CODE
AND LOGICAL_DB_ENVIRONMENT.LOGICAL_DB_ENV_NAME = APP_FRAMES.LOGICAL_DB_ENV_NAME
AND APP_FRAME_PROPERTIES.LOGICAL_DB_ENV_NAME = APP_FRAMES.LOGICAL_DB_ENV_NAME
AND NODES.FRAME_NAME = APP_FRAME_PROPERTIES.FRAME_NAME
AND APP_FRAMES.FRAME_NAME = APP_FRAME_PROPERTIES.FRAME_NAME
AND APP_FRAMES.APP_EXT_CODE =: IN_APP_EXT_CODE
@@[email protected]@
) RES_DETAIL
ON
TEST_APP_ENTRIES.APP_EXT_CODE = RES_DETAIL.APP_EXT_CODE
AND TEST_APP_ENTRIES.ZONE_ENV_CODE = RES_DETAIL.ZONE_ENV_CODE ORDER BY TEST_APP_ENTRIES.WAE_ID,WARE_ID';
IF(IN_ZONE_ENV_CODE IS NOT NULL AND IN_ZONE_ENV_CODE = 'UAT') THEN
IN_ZONE_ENV_CODE := 'DEV';
ELSIF(IN_ZONE_ENV_CODE IS NOT NULL AND IN_ZONE_ENV_CODE = 'PROD') THEN
IN_ZONE_ENV_CODE := 'UAT';
END IF;
IF(IN_ZONE_ENV_CODE IS NULL OR IN_ZONE_ENV_CODE = '' OR IN_ZONE_ENV_CODE = 'ALL') THEN
QUERY_STR := REPLACE(QUERY_STR,ZONE_CODE_FLAG,'');
QUERY_STR := REPLACE(QUERY_STR,LOGICAL_ENV_FLAG,'');
IF(IN_ACTIVE IS NULL OR IN_ACTIVE = '') THEN
QUERY_STR := REPLACE(QUERY_STR,ACTIVE_FLAG,'');
OPEN OUT_RESULT FOR QUERY_STR USING IN_APP_EXT_CODE,IN_APP_EXT_CODE;
ELSE
QUERY_STR := REPLACE(QUERY_STR,ACTIVE_FLAG,ACTIVE_STR);
OPEN OUT_RESULT FOR QUERY_STR USING IN_APP_EXT_CODE,IN_ACTIVE,IN_APP_EXT_CODE;
END IF;
ELSIF (IN_ACTIVE IS NULL OR IN_ACTIVE = '') THEN
QUERY_STR := REPLACE(QUERY_STR,ACTIVE_FLAG,'');
QUERY_STR := REPLACE(QUERY_STR,ZONE_CODE_FLAG,ZONE_CODE_STR);
QUERY_STR := REPLACE(QUERY_STR,LOGICAL_ENV_FLAG,LOGICAL_ENV_STR);
OPEN OUT_RESULT FOR QUERY_STR USING IN_APP_EXT_CODE,IN_ZONE_ENV_CODE,IN_APP_EXT_CODE,IN_ZONE_ENV_CODE;
ELSE
QUERY_STR := REPLACE(QUERY_STR,ZONE_CODE_FLAG,ZONE_CODE_STR);
QUERY_STR := REPLACE(QUERY_STR,LOGICAL_ENV_FLAG,LOGICAL_ENV_STR);
QUERY_STR := REPLACE(QUERY_STR,ACTIVE_FLAG,ACTIVE_STR);
OPEN OUT_RESULT FOR QUERY_STR USING IN_APP_EXT_CODE,IN_ZONE_ENV_CODE,IN_ACTIVE,IN_APP_EXT_CODE,IN_ZONE_ENV_CODE;
END IF;
Хотя я прочел это, я подумал, что должен хотя бы спросить, есть ли причина, по которой вы не используете фактические связанные параметры со статическим SQL-запросом. Я довольно уверен, что вы хотите сделать, это может быть выполнено с помощью параметризованного запроса, а не для совместного объединения динамически построенных SQL. – gmiley
Да, я выбираю параметризованный запрос, а не конкатенацию для безопасного выполнения запроса. – sunleo
Вы используете 'REPLACE' для замены кода, чтобы заменить переменную place-holder. Это не параметризуется. Вы все еще, в основном, объединяете запрос вместе, и это никоим образом не безопасно. Найдите google для 'using oracle bind variables' для запуска. – gmiley