0

我正在使用 PostgreSQL 版本 8.2 并尝试将所有函数/视图源代码保存为本地的每个文件。但是似乎不可能将每个函数的代码提取到每个文件中。

例子:

我想保存如下源文件:

函数 a1, a2, a3 -----> a1.sql, a2.sql, a3.sql

我该怎么做?

4

1 回答 1

0

这不是一个完整的解决方案,但应该让您朝着正确的方向开始。


假设您正在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

于 2019-07-17T06:13:11.027 回答