有好几次,我发现自己重构Web应用程序代码,并最终想要做这样的事情(的Groovy在这种情况下,但可以是任何东西):
Map getData(String relationName, Integer rowId) {
def sql = Sql.newInstance([...])
def result = sql.firstRow('SELECT getRelationRow(?,?)', relationName, rowId)
sql.close()
return new HashMap(result)
}
其中所存储的程序getRelationRow(relname text, rowid integer)
执行动态sql检索指定的行rowid
在所请求的关系。 我见过这样的功能的最好的例子就是这种多态函数使用anyelement
类型,被称为
SELECT * FROM data_of(NULL::pcdmet, 17);
然而,为了把这个在上面的代码需要
def result = sql.firstRow("SELECT * FROM data_of(NULL::${relationName},?)", rowId)
也就是说,它需要的关系名称粘贴到查询,哪些风险SQL注入。 那么,有没有去保持存储过程的多态性善良,但允许它与一般的关系,名字叫?