Kok*_*zzu 4 sql postgresql sql-view
PostgreSQL 中可以创建带有参数的视图吗?
问题是,我们的后端服务中可能存在未经验证的 SQL 语法,这可能会导致内部服务器错误,所以我可能需要将每个查询转换为视图?
像这样的东西:
query := ` --
func Bla_ByType
SELECT id
, data
-
>>
'name'
FROM bla
WHERE data->>'type' = ` + escapeAndQuote(param1)
Run Code Online (Sandbox Code Playgroud)
上面的语法未被检测为错误,因为它只是一个字符串,正确的语法是:
query := ` -- func Bla_ByType
SELECT id
, data->>'name'
FROM bla
WHERE data->>'type' = ` + escapeAndQuote(param1)
Run Code Online (Sandbox Code Playgroud)
上面的例子只是一个简单的查询,其他的则更长,如下所示:
WITH t AS (
SELECT ...
FROM
WHERE param1
) SELECT ...
FROM ...
LEFT JOIN t
WHERE param2`
Run Code Online (Sandbox Code Playgroud)
除了阅读课程之外还有其他选择吗:
CREATE OR REPLACE VIEW v_bla_bytype AS
SELECT id
, data->>'name'
FROM bla
WHERE data->>'type' = CAST(current_setting('bla_bytype._type') as TEXT)
SET bla_bytype._type = 'test';
SELECT * FROM v_bla_bytype;
Run Code Online (Sandbox Code Playgroud)
会话变量的问题仍然会出现错误,例如:ERROR: unrecognized configuration parameter "bla_bytype._type"如果程序员忘记设置会话变量。
或者使用存储过程:
CREATE OR REPLACE FUNCTION p_bla_bytype(_type text)
RETURNS TABLE (id bigint, name text) AS $$
SELECT id
, data->>'name'
FROM bla
WHERE data->>'type' = $1
$$ LANGUAGE sql;
-- i don't know hot to use "_type" by name not using number ($1)
SELECT * FROM p_bla_bytype('test');
Run Code Online (Sandbox Code Playgroud)
存储过程的问题是列名必须输入两次(一次在SELECT,一次在RETURNS),我们还需要声明数据类型。
除了这两个之外,还有其他/更短的解决方案吗?也许是这样的:
CREATE OR REPLACE PARAMETERIZED VIEW pv_bla_bytype(_type TEXT) AS
SELECT id
, data->>'name' "name"
FROM bla
WHERE data->>'type' = $_type
;
SELECT * FROM pv_bla_bytype('test');
Run Code Online (Sandbox Code Playgroud)
解决方案应该有:
PostgreSQL中有这样的解决方案吗?
试试功能?...
CREATE OR REPLACE function pv_bla_bytype(_type TEXT) returns table (id bigint, name text) AS
$F$
declare
begin
return query
SELECT bla.id
, data->>'name' "name"
FROM bla
WHERE data->>'type' = _type
;
end;
$F$
language plpgsql
;
SELECT * FROM pv_bla_bytype('test');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8430 次 |
| 最近记录: |