为什么PostgreSQL需要Execute脚本而不需要query_to_xml脚本?

时间:2018-03-14 15:11:56

标签: sql postgresql

我是PostgreSQL的新手。我对PostgreSQL脚本有疑问。

在我上一次question我试图使用"执行" 。然后我才知道,如果我想在查询中使用Execute,我必须制作脚本(使用$$ LANGUAGE ...)。

但是从类似的问题中得到一个答案,使用query_to_xml并且它不需要脚本。为什么?

1 个答案:

答案 0 :(得分:2)

与SQL Server不同,Postgres(以及许多其他DBMS,如Oracle,DB2,Firebird)在程序代码和SQL之间做了明确的区分。程序代码只能在函数(或过程)的上下文中运行。 do块本质上是一个不返回任何内容的匿名函数。

动态SQL只能在过程代码中使用。 query_to_xml正是这样做的:它使用动态SQL。

要计算表中的行,您还可以创建一个使用动态SQL的函数:

create function count_rows(p_schemaname text, p_tablename text)
  returns bigint
as
$$ 
declare
  l_stmt text;
  l_count bigint;
begin
  l_stmt := format('select count(*) from %I.%I', p_schemaname, p_tablename);
  execute l_stmt
    into l_count;
  return l_count;
end;
$$
language plpgsql;

然后您可以使用:

select schema_name, table_name, count_rows(schema_name, table_name)
from information_schema.tables
where schema_name = 'public';

query_to_xml与函数count_rows()完全相同 - 它只是运行任何 SQL语句并将结果作为XML返回的通用函数,而不是专门的功能只做一件事。