我的 my_table 包含两个文本列: my_query ,其中包含各种文本形式的DML查询;和 my_explanation ,完全填充 nulls 。
我想做类似的事情:
template<typename T>
void LL<T>::bubbleSortI()
{
bool hasChanged = true;
int swapcount = 0;
while (hasChanged)
{
int changecount = 0;
LL_iterator<T> it1 = begin();
LL_iterator<T> it2 = begin();
++it2;
while(it2!=trailer)
{
if (*it1 > *it2)
{
it1.swap(it2);
swapcount++;
changecount++;
}
++it1;
++it2;
}
if(changecount==0)
{
hasChanged = false;
}
}
cout << swapcount << " swaps performed on the list. The list is now ordered." << "\n";
}
以便每行上的 my_explanation 列更新为包含 my_query 中包含的查询的解析分析的文本输出列。
我尝试用游标创建一个函数,但它没有用。我还在学习pgplsql。有什么想法吗?
答案 0 :(得分:1)
EXECUTE
是PL / pgSQL语句;它不能在SQL查询中使用,只能在LANGUAGE plpgsql
函数或DO
block中使用。
您可能想要这样的功能:
CREATE FUNCTION explain_query(sql TEXT) RETURNS SETOF TEXT AS $$
BEGIN
RETURN QUERY EXECUTE 'EXPLAIN ANALYZE ' || sql;
END
$$
LANGUAGE plpgsql;
由于EXPLAIN
会返回多行,因此您需要汇总输出以使其适合my_table
中的单个记录:
UPDATE my_table
SET my_explanation = (
SELECT string_agg(plan, E'\n')
FROM explain_query(my_query) plan
)