我需要针对白名单验证给定的输入字符串,白名单是select语句的输出。最有效的方法是什么?
示例:
WhiteList -- { select distinct object_type from dba_objects; }
Input -- 'my_input_varchar'
现在我需要检查上面的白名单中是否存在my_input_varchar
。
我正在寻找一个最佳解决方案,因为这个验证将从我的代码中多次完成,然后触发上面白名单中给出的选择查询将是性能开销。
请告诉我你的建议。
虽然以下内容不正确,但这是我的要求:
declare
c_type varchar2(100) := 'QUEUE';
begin
If c_type IN (select distinct object_type from dba_objects) then
dbms_output.put_line('YES');
else
dbms_output.put_line('NO');
end if;
end;
答案 0 :(得分:1)
你到底想要达到什么目的?你可以使用类似的东西:
DECLARE
c_type VARCHAR2(100) := 'QUEUE';
v_count NUMBER;
BEGIN
SELECT COUNT(1)
INTO v_count
FROM dual
WHERE EXISTS (SELECT 1 FROM dba_objects WHERE object_type = c_type);
IF v_count > 0 THEN
dbms_output.put_line('YES');
ELSE
dbms_output.put_line('NO');
END IF;
END;
答案 1 :(得分:0)
有许多不同的方法......据我所知,你有一个预定义的SQL语句,你无法改变,你想要处理输出。
您可以尝试将数据加载到集合中。即使使用循环,它仍然是一种有效的解决方案。数据只收集一次,并存在于内存中。
DECLARE
CURSOR select_stmt_cur IS
-- your query
SELECT object_type
FROM user_objects;
TYPE select_stmt_ntt IS TABLE OF select_stmt_cur%ROWTYPE;
l_select_stmt select_stmt_ntt;
FUNCTION if_exists(input_in IN VARCHAR2) RETURN BOOLEAN
AS
BEGIN
FOR indx IN l_select_stmt.FIRST..l_select_stmt.LAST LOOP
IF l_select_stmt(indx).object_type = input_in THEN
RETURN TRUE;
END IF;
END LOOP;
RETURN FALSE;
END if_exists;
BEGIN
OPEN select_stmt_cur;
FETCH select_stmt_cur BULK COLLECT INTO l_select_stmt;
CLOSE select_stmt_cur;
IF if_exists('PACKAGE') THEN
DBMS_OUTPUT.PUT_LINE('YES');
ELSE
DBMS_OUTPUT.PUT_LINE('NO');
END IF;
END;