【问题标题】:pgsql stored procedure - internal, c or sql language is the best?pgsql 存储过程 - 内部、c 或 sql 语言是最好的?
【发布时间】:2013-06-27 14:56:58
【问题描述】:

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

  1. 内部
  2. c
  3. sql

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

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

select * from pg_language

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

编辑 - 解决后

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

select * from pg_pltemplate

您可以阅读更多关于创建语言here

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

【问题讨论】:

  • 确定你没有PL/pgSQL吗?听起来很奇怪,托管程序允许 C(这可能会使服务器崩溃)但不允许 PL/pgSQL。到底什么是“内部”?
  • 我编辑了我的问题。我会在星期一问他们,也许他们会安装 pl/pgsql。我不知道什么是内部的,这是我使用 postgresql 的第一天,我对 c 和内部一无所知,这就是为什么我问...
  • 那是哪个 Postgres 版本?自 9.0 起默认安装 PL/pgSQL
  • 版本为8.4。我想我选错了我的供应商。让我们看看吧,我会在星期一给他们打电话来添加程序语言支持......

标签: postgresql


【解决方案1】:

通常,您可以使用四、五种 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。

【讨论】:

    【解决方案2】:

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

    所以你有

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

    如果你跑了

    创建语言 plpgsql;

    PL/pgSQL 会出现另一行(如果你有privilege)。

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

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

    也出现在列表中。


    关于选择语言的一些准则

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

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

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

    • 如果您必须从现有的语言中选择一种,请考虑 PL/pgSQL。它通常始终安装,您不必处理内存分配。

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

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

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

    【讨论】:

    • 同时我检查了 lanpltrusted 意味着它只能由超级用户运行,所以我没有 c 和内部的权限......所以我目前唯一可以运行的语言是 sql。它是否能够例如循环? MySQL 有能力,但它没有单独的过程语言......我想我会打电话给提供者......
    • “正常”(即默认)安装也应该列出 PL/pgSQL。因为自 9.0 以来的每个版本都默认安装它。您必须从默认安装中主动删除 PL/pgSQL。
    • @a_horse_with_no_name 感谢您的提示,我已经更新了我的答案。
    • @inf3rno SQL 没有循环(它相当实用)。我会先尝试create language pgsql。如果这是不允许/可能的,我会尝试说服提供者:-)
    【解决方案3】:

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

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

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

    【讨论】:

    • 代码就是代码,不管是什么语言。数据库代码与 java 测试一样复杂。 .net 或其他。您只需要工具和技能。
    • 抱歉,Audrius,但我不能接受。我清楚地写下了我的选择,而 PL/PSQL 不是其中之一。存储过程的优缺点我已经知道了。
    • 随着技术的存在,它们可能有自己的应用领域。从你的问题来看,为什么 PL/PSQL 不是你的选择并不明显,但它当然可能是真的。
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多