2014-01-27 81 views
1

我有一個只包含ID和特定的模式描述幾個表,我不知道是否有可能寫一個通用的函數,它會讀這樣的:通用的Oracle查詢驗證功能

create or replace FUNCTION tab_lookup (key_field char,key_value char,from_table char,return_field char) RETURN char IS 
a varchar2(1000); 
BEGIN 

select &return_field into a 
from &from_table 
where &key_field=key_value; 
return(a); 
exception 
    when others 
    then 
    return('*ERR*'); 
END; 

我想在只有50個用戶將使用的內部應用程序中使用它。

+0

您可以隨時建立外鍵約束。 – haki

+0

外鍵已經存在..我只是想加快前端開發。 – shinobi92

+0

您確實知道每次調用都會爲您節省1個字符? 'a:= tab_lookup('keyfield','keyvalue','mytable','returnfield');'vs'選擇來自mytable的returnfield,其中keyfield ='keyvalue';' –

回答

0

修改您的版本,通過使用Dynamic SQL改變它,改變了輸入參數的數據類型爲VARCHAR2

CREATE OR REPLACE FUNCTION tab_lookup (key_field VARCHAR2, 
             key_value VARCHAR2, 
             from_table VARCHAR2, 
             return_field VARCHAR2, 
             return_type VARCHAR2) 
RETURN VARCHAR2 IS 
result_a varchar2(1000); 
query_string VARCHAR2(4000); 
/*version 0.1*/ 
BEGIN 

    query_string := 'SELECT '||return_field|| 
        'FROM '||from_table|| 
        'WHERE '||key_field || ' = :key_value '; 

    IF(return_type = 'SQL') THEN 
    result_a := query_string; 
    ELSE 

     //this line will not work in forms 6i remove the using key_value word 
     EXECUTE IMMEDIATE query_string USING key_value into result_a; 
    END IF; 

    RETURN (result_a); 
EXCEPTION 

// add DBMS_ASSERT Exceptions 
WHEN 
    NO_DATA_FOUND THEN 
     RETURN(NULL); 
WHEN 
    TOO_MANY_ROWS THEN 
     RETURN('**ERR_DUPLICATE**'); 
WHEN OTHERS 
THEN 
     RETURN('*ERR_'||SQLERRM); 
END; 
+0

爲什麼會有單引號逃脫?要連接的值不能包含它們,並且綁定變量不需要轉義。可能值得檢查一下傳遞的值是否至少有效的標識符,使用['DBMS_ASSERT'](http://docs.oracle.com/cd/E18283_01/appdev.112/e16760/d_assert.htm)「進行連接以避免SQL注入。 –

+0

如果你能在上下文中演示DBMS_ASSERT,那將是非常好的 – shinobi92