2014-01-27 48 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