1

我需要针对作为 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;  
4

2 回答 2

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;
于 2013-10-31T07:54:22.440 回答
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;
于 2013-10-31T09:43:05.200 回答