Несколько раз я нашел рефакторинг кода веб-приложения и в конечном итоге хочу сделать что-то вроде этого (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 Injection. Итак, есть ли возможность сохранить полиморфную доброту хранимой процедуры, но разрешить ее вызывать с именами общих имен?