在plsql中有效地检查白名单

时间:2013-10-31 04:41:34

标签: sql plsql

我需要针对白名单验证给定的输入字符串,白名单是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;  

2 个答案:

答案 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;