表名作为PostgreSQL函数参数
我想在Postgres函数中传递一个表名作为参数。我试过这个代码:
CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer AS $$ BEGIN IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN return 1; END IF; return 0; END; $$ LANGUAGE plpgsql; select some_f('table_name'); 我得到这个: ERROR: syntax error at or near "." LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)... ^ ********** Error ********** ERROR: syntax error at or near "." 这里是我得到的错误改变为这个select * from quote_ident($ 1)tab where tab.id = 1: ERROR: column tab.id does not exist LINE 1: ...T EXISTS (select * from quote_ident($1) tab where tab.id... 可能,quote_ident($ 1)工作,因为没有where quote_ident($ 1).id = 1部分,我得到1,这意味着某事被选中。为什么第一个quote_ident($ 1)可以工作,第二个不同时工作?这怎么可能解决?
这可以进一步简化和改进:
CREATE OR REPLACE FUNCTION some_f(_tbl regclass,OUT result integer) AS $func$ BEGIN EXECUTE format('SELECT (EXISTS (SELECT 1 FROM %s WHERE id = 1))::int',_tbl) INTO result; END $func$ LANGUAGE plpgsql; 调用(使用模式限定名称的示例 – 请参见下文): SELECT some_f('myschema.mytable'); -- would fail with quote_ident() 要么: SELECT some_f('"my very uncommon table name"') 要点 >使用OUT参数简化功能。您可以直接选择动态SQL的结果并完成。不需要额外的变量和代码。 > ..它也阻止SQL注入。 >我仍然使用 EXECUTE 'SELECT (EXISTS (SELECT 1 FROM ' || _tbl || ' WHERE id = 1))::int' >不需要对id列进行表格限定。 用PostgreSQL 9.1测试。 format()至少需要该版本。 这就是为什么你总是正确转义动态SQL的用户输入: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 真正的Hybrid APP没你想的那么简单
- c# – .net core DI中的异步提供程序
- 在没有rails的ruby中实现rails before_filter
- ajax的简单用法发起对服务器的请求
- JsonCpp的简单使用方法
- swift中UICollectionView的使用(headerview/footerview/ce
- [BerkeleyDB&SQLLite]BerkeleyDB与SQLite评测对比
- Swift3.0之String转换成基本数据类型 Int CGFloat Double
- package – 使用Bower更新多个依赖关系
- 如何在PostgreSQL的地理数据上改进“GROUP BY”的“MAX”?