- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一种情况想要返回两个 View 之间的连接。这是很多专栏。这在 sql server 中非常容易。但是在我进行连接时在 PostgreSQL 中。我收到错误“需要列定义列表”。
有什么方法可以绕过这个,我不想提供返回列的定义。
CREATE OR REPLACE FUNCTION functionA(username character varying DEFAULT ''::character varying, databaseobject character varying DEFAULT ''::character varying)
RETURNS SETOF ???? AS
$BODY$
Declare
SqlString varchar(4000) = '';
BEGIN
IF(UserName = '*') THEN
Begin
SqlString := 'select * from view1 left join ' + databaseobject + ' as view2 on view1.id = view2.id';
End;
ELSE
Begin
SqlString := 'select * from view3 left join ' + databaseobject + ' as view2 on view3.id = view2.id';
End;
END IF;
execute (SqlString );
END;
$BODY$
最佳答案
您当前拥有的可以简化/净化为:
CREATE OR REPLACE FUNCTION func_a (username text = '', databaseobject text = '')
RETURNS ????
LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY EXECUTE
format ('SELECT * FROM %s v1 LEFT JOIN %I v2 USING (id)'
, CASE WHEN username = '*' THEN 'view1' ELSE 'view3' END
, databaseobject);
END
$func$;
您只需要 BEGIN ... END
in the function body 的额外实例以它们自己的范围启动单独的代码块,这很少需要。
标准的 SQL 连接运算符是 ||
。 +
是您以前供应商的“创造性”添加。
不要使用 CaMeL-case identifiers除非你双引号他们。最好根本不要使用它们,请参阅:
varchar(4000)
也针对 SQL Server 的特定限制进行了定制。它在 Postgres 中没有特殊意义。如果您确实需要 4000 个字符的限制,则仅使用 varchar(4000)
。我只会使用 text
- 除了我们在简化函数之后根本不需要任何变量。
如果你还没有使用过format()
,consult the manual here .
现在,对于您的实际问题:动态查询的返回类型可能很棘手,因为 SQL 要求最迟在调用时声明它。如果你的数据库中有一个表或 View 或复合类型已经匹配列定义列表,你可以使用它:
CREATE FUNCTION foo()
RETURNS SETOF my_view AS
...
否则,用 out 拼写列定义列表(最简单的)RETURNS TABLE
:
CREATE FUNCTION foo()
RETURNS TABLE (col1 int, col2 text, ...) AS
...
如果你正在制作行类型,你可以返回匿名记录:
CREATE FUNCTION foo()
RETURNS SETOF record AS
...
但是你必须在每次调用时提供一个列定义列表,所以我很少使用它。
我不会使用 SELECT *
作为开头。使用明确的列列表返回并相应地声明您的返回类型:
CREATE OR REPLACE FUNCTION func_a(username text = '', databaseobject text = '')
RETURNS TABLE(col1 int, col2 text, col3 date)
LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY EXECUTE
format ($f$SELECT v1.col1, v1.col2, v2.col3
FROM %s v1 LEFT JOIN %I v2 USING (id)$f$
, CASE WHEN username = '*' THEN 'view1' ELSE 'view3' END
, databaseobject);
END
$func$;
对于完全动态的查询,考虑首先在您的客户端中构建查询,而不是使用函数。
您需要先了解基础知识:
然后有更多高级选项 polymorphic types ,它允许您在调用时传递返回类型。更多在最后一章:
关于postgresql - 从 PostgreSQL 函数返回 SETOF 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17864911/
我编写了一个函数,它接受两个参数并返回一个 SETOF 结果。 创建函数 foo(parentId bigint, childId bigint) 返回 SETOF 栏 AS ... 我想为这个函数编
我使用的谓词如下所示: predicate(Country, X):- setof(Length, anotherPredicate(Country,Length), X). 我的问题是我的代
我使用的谓词如下所示: predicate(Country, X):- setof(Length, anotherPredicate(Country,Length), X). 我的问题是我的代
我需要一个满足目标的有序对象列表。 setof 负责排序,但当没有对象满足目标时会失败。我想像 findall 那样返回一个空列表。 这可行,但是有没有一种方法可以在不削减的情况下实现这一点?我正在使
SELECT GENERATE_SERIES(0, 2) 和 SELECT * FROM GENERATE_SERIES(0, 2) 很有用,因为返回列和行...还有 SELECT id,GENERA
快速背景:PostgreSQL 非常新,来自 SQL Server。我正在将存储过程从 SQL Server 转换为 PostgreSQL。我已阅读 Postgres 9.3 文档并查看了大量示例和问
我有一个自定义类型: create type some_type as ( some_bool_param boolean, str varch
函数 json_object_keys(json) 返回一个 setof text。如何将此 setof text 转换为所有元素均由 ',' 分隔的字符串?我必须使用函数 array_to_stri
我正在编写一个 PL/pgSQL 存储过程,它将返回一组记录;每条记录包含现有表的所有字段(称之为零售商,它有两个字段:retailer_key 和 retailer_name)。这当然有效: CRE
进入 PL/pgSQL... 我还在学习语法。有时,我会遇到此错误消息: ERROR: cannot use RETURN QUERY in a non-SETOF function 这听起来有点神秘
我在 Postgresql 中有一个基本的用户表, CREATE TABLE myuser ( userId bigserial primary key, user_name varchar(3
我有以下 - 不工作 - 功能: CREATE FUNCTION permission_cache_update(affected_user_list int[]) RETURNS TABLE(u
我在 DBMS (Postgresql) 中有这个存储过程 CREATE OR REPLACE FUNCTION getallentree() RETURNS SETOF entree AS $B
我有一个简短的问题。在序言中使用 setof 的存在限定符(即 ^)。 使用SICStus,似乎(尽管许多网站声称如此),S确实似乎在下面的代码中被量化(使用沼泽标准,事实的母亲/ child ,我没
这个问题在这里已经有了答案: PostgreSQL "Column does not exist" but it actually does (6 个答案) sql statement error:
我对 postgresql 比较陌生,正在努力熟悉它。我在编写新的 pl/sql 函数时遇到了错误。 错误:类型“ordered_parts”不存在 CREATE OR REPLACE FUNCT
我正在将 SETOF 从 Postgres FUNCTION 返回到 PHP/PDO。不幸的是,我得到每行返回的 2 个副本。 这是 Postgres 类型: CREATE TYPE marker A
我有一个复杂的 PSQL 函数返回表记录的 SETOF(树中叶记录的祖先路径,哎呀),通常一次只有几条记录 - 祖先 - 和这非常适合应用程序的其余部分。 例如,给定记录: id: 5, parent
我正在尝试保护我的数据库免受 SQL 注入(inject)攻击。我有许多返回 SETOF 我预定义数据类型的存储函数。例如: create type userLoginUserIdPasswordRe
我已经动态生成了 SELECT。我尝试将结果作为 SETOF RECORD 返回。诸如此类: CREATE FUNCTION test(column_name text) RETURNS SETOF
我是一名优秀的程序员,十分优秀!