我正在使用 PostgreSQL 版本 8.2 并尝试将所有函数/视图源代码保存为本地的每个文件。但是似乎不可能将每个函数的代码提取到每个文件中。
例子:
我想保存如下源文件:
函数 a1, a2, a3 -----> a1.sql, a2.sql, a3.sql
我该怎么做?
我正在使用 PostgreSQL 版本 8.2 并尝试将所有函数/视图源代码保存为本地的每个文件。但是似乎不可能将每个函数的代码提取到每个文件中。
例子:
我想保存如下源文件:
函数 a1, a2, a3 -----> a1.sql, a2.sql, a3.sql
我该怎么做?
这不是一个完整的解决方案,但应该让您朝着正确的方向开始。
假设您正在psql
为此使用,您可以通过将输出假脱机到文件来保存单个函数的源代码select procsrc from pg_proc where proname = '...'
,例如:
\t
\a
\o a1.sql
select prosrc from pg_proc where proname = 'a1';
\o
\t \a
配置psql
为仅输出列的内容prosrc
。将\o a1.sql
查询结果重定向到文件。
由于您需要每个函数一个文件,因此您需要为每个函数运行它。您可以手动执行此操作,也可以通过运行 SQL 语句生成执行此操作的脚本:
\t \a \o extract_source.sql
select concat('\t '\a \o ', proname, '.sql', chr(10),
'select prosrc from pg_proc where proname = ''', proname, ''';',
chr(10),
'\o', chr(10))
from pg_proc;
\o
\i extract_source.sql
该查询为每个过程生成第一个脚本,然后运行生成的脚本。
未经测试,您可能需要对其进行调整以满足您的需求。
请注意, 的内容prosrc
不是完整的功能。
它缺少返回类型、参数和语言定义。在更现代的 Postgres 版本中,您可以使用pg_get_functiondef()
它,但在 8.2 中,您需要使用pg_proc
. 最复杂的部分是正确获取函数参数(因为 Postgres 8.2 也缺少,pg_get_function_arguments()
)
如果没有参数,它将类似于:
select concat('create or replace function ',
proname, '(......) ',
'returns ', rt.typname,
' as $$ ',
prosrc,
'$$ language ', l.lanname, ';')
from pg_proc p
join pg_language l on l.oid = p.prolang
join pg_type rt on rt.oid = p.prorettype
where proname = 'a1';
而不是“只是” select prosrc .... from pg_proc
。