1

我有一个具有以下存储过程语言支持的生产 pgsql 服务器:

  1. 内部的
  2. C
  3. sql

我找不到 internal 和 c 的示例,只有 pl/pgsql 或在极少数情况下 sql。我会尝试让提供商安装其他语言,但提供商通常不提供,所以我认为不会发生这种情况......所以我被这些语言困住了......

我应该选择哪一个,为什么?(如果您也有很好的教程,请在您的答案或评论中写下)

select * from pg_language

在此处输入图像描述

顺便说一句,没有教程我无法测试 c 和内部,所以也许有一个简单的解决方案:我不能使用它们,因为它们不受信任。

编辑 - 解决方案之后

create language我有用的东西。之后,我通过以下查询检查了哪些语言可用:

select * from pg_pltemplate

在此处输入图像描述

您可以在此处阅读有关创建语言的更多信息。

我将使用 plpgsql,我在这里找到了一本关于 postgresql 的好书:The PostgreSQL Programmer's Guide ,由 Thomas Lockhart 编辑

4

3 回答 3

3

通常,您可以使用四、五种 PL 语言 - SQL、PL/pgSQL、PL/Python 或 PL/Perl、C。

  • SQL - 简短的一行函数 - 由于内联(如宏)可以超快
  • PL/pgSQL - 适合业务逻辑实现(不管你喜欢与否,它可以加速你的应用程序:更少的网络流量,更少的数据类型转换,更少的进程间通信 - PLpgSQL 使用与 Postgres 兼容的类型,并且函数在 PostgreSQL SQL 中执行执行器进程) - 由于对 SQL 的本机支持,因此适用于具有大量 SQL 查询的代码(您可以喜欢它,也可以更喜欢 ORM - 我个人不喜欢 ORM - 我知道它是主要的性能杀手)。
  • PL/Python 或 PL/Perl - 适用于 PL/pgSQL 不好或缺少必要功能的特殊任务 - 我喜欢 PL/Perl,因为有可能在 PostgreSQL 中使用 CPAN 存档 - 需要发送 main 或需要进行 SOAP 调用 - 一切都是在 CPAN 中。
  • C - 需要最高性能或访问 PostgreSQL 内部 - 然后使用 C 函数。一些通用字符串、日期、数学例程的快速实现是 C 语言中最简单的。

您可以在以下位置找到 C 代码示例

C 语言可用于实现自己的数据类型、必要的操作和索引支持。你可以找到很多 PostgreSQL 扩展——非常有名的是 PostGIS。

于 2013-06-30T17:55:20.047 回答
2

查看您的 列表pg_language,这显示了默认值:如果我使用createdbPostgreSql 8.4/Debian 创建一个新数据库,则输出相同。该列表可能已经包含 PL/pgSQL 的另一行,具体取决于版本和/或您的数据中心(由 a_horse_with_no_name 指出)。

所以你有了

  • “内置函数”(内部)
  • “动态加载的 C 函数”(c)
  • “SQL 语言函数” (sql)

如果你跑

创建语言 plpgsql;

PL/pgSQL 将出现另一行(如果您有权限)。

例如,如果你安装了 PL/Java,你会得到

  • “Java 受信任”(java)
  • “Java 不受信任” (javau)

它也出现在列表中。


关于选择语言的一些准则

  • 如果您想要更高级的语言,请考虑使用Scala(分别需要支持 PL/Java 或基于 JVM 的存储过程)。因此,您不仅在 SQL 中,而且在存储的函数/过程中都有功能范式。当然,像 Java 一样,您也有 OOP。

  • 如果您使用的是Java,请查看 Java 存储过程(需要 PL/Java)。举个例子,看这里。与 PL/pgSQL 相比,您拥有完整的 OOP。

PL/Java 往往难以安装,因此数据中心并不真正喜欢它。这是值得的,因为您可以为客户端/应用程序服务器和存储过程/函数使用相同的语言:无需学习另一种语言。例如,您可以以相同的方式访问结果集。唯一不同的是 JDBC URL。与 PL/pgSQL 相比,如果其他数据库也支持基于 JVM 的存储过程,这些存储过程是可移植的。

  • 如果您必须从已经可用的语言中选择一种,请考虑PL/pgSQL。它通常总是安装的,您不必处理内存分配。

  • 如果您必须与操作系统/库交互,则有C。要获得印象,请看这里。这并不难,只是围绕功能的更多样板。

  • 如果你想要C++,那就更难了,因为 PostgreSql 和 C/C++ 模块之间的接口使用 C 调用约定,所以你应该有一个 C 文件,它位于 PostgreSql 和你的 C++ 模块之间。要获得印象,请看这里

如果您不使用 PL/pgSQL,最困难的部分是安装(PL/Java)和接口代码(PL/Java、PL/C、PL/C++)。如果您最初设置了它,那么在存储过程/函数中也拥有您真正想要的语言真的很高兴。这是值得的麻烦。

于 2013-06-30T10:29:49.627 回答
1

如果您从您也开发的某些软件工具(例如,从 java 通过 JDBC)访问数据库,最好简化查询,在客户端做更多工作并避免数据库端脚本。

理由是这些服务器端脚本更难测试(单元测试需要数据库)、调试(通常比调试器下您自己的代码更复杂)和维护(升级等)。服务器端脚本中的错误经常被忽视,因为它们是独立的,客户端开发人员很少看到这些脚本。

但是,如果无论如何更喜欢,我们过去使用过 PL/PSQL,因为它可以通过 JDBC 连接自动在服务器上安装所有代码的自动化脚本。

于 2013-06-30T08:11:04.853 回答