php - 在php中替换postgres存储过程
问题描述
我面临着运行第三方软件的任务,cockroachdb
而不是支持的postgresql
. 我天真地认为这将是一个简单的转换,就像cockroachdb
postgresqlsuperset
一样。但是,当我进行转换时,我意识到cockroachdb
不支持Stored Procedures
和Triggers
. 有一个functions.sql
文件包含Stored Procedures
调用 SQL 函数的各种 php 文件。由于cockroachdb
不支持存储过程,我的想法是创建模仿 SQL 文件中存储过程的 php 函数。这是我能想到的唯一解决方法,但我对 php 的了解几乎为零,因此您的专业知识会有所帮助。我假设这可以根据我对 python 的了解来完成,我可以使用 pyscopg2 库或像 SQLAlchemy 这样的 ORM。
下面是其中一个存储过程:
CREATE OR REPLACE FUNCTION date_format(
timestamp without time zone,
text)
RETURNS text AS $$
DECLARE
i int := 1; temp
text := '';
c text;
n text;
res text;
BEGIN
WHILE i <= pg_catalog.length($2)
LOOP c := SUBSTRING ($2 FROM i FOR 1);
IF c = '%' AND i != pg_catalog.length($2) THEN n := SUBSTRING ($2 FROM (i + 1) FOR 1);
SELECT INTO res CASE
WHEN n = 'a' THEN pg_catalog.to_char($1, 'Dy')
WHEN n = 'b' THEN pg_catalog.to_char($1, 'Mon')
WHEN n = 'c' THEN pg_catalog.to_char($1, 'FMMM')
WHEN n = 'D' THEN pg_catalog.to_char($1, 'FMDDth')
WHEN n = 'd' THEN pg_catalog.to_char($1, 'DD')
WHEN n = 'e' THEN pg_catalog.to_char($1, 'FMDD')
WHEN n = 'f' THEN pg_catalog.to_char($1, 'US')
WHEN n = 'H' THEN pg_catalog.to_char($1, 'HH24')
WHEN n = 'h' THEN pg_catalog.to_char($1, 'HH12')
WHEN n = 'I' THEN pg_catalog.to_char($1, 'HH12')
WHEN n = 'i' THEN pg_catalog.to_char($1, 'MI')
WHEN n = 'j' THEN pg_catalog.to_char($1, 'DDD')
WHEN n = 'k' THEN pg_catalog.to_char($1, 'FMHH24')
WHEN n = 'l' THEN pg_catalog.to_char($1, 'FMHH12')
WHEN n = 'M' THEN pg_catalog.to_char($1, 'FMMonth')
WHEN n = 'm' THEN pg_catalog.to_char($1, 'MM')
WHEN n = 'p' THEN pg_catalog.to_char($1, 'AM')
WHEN n = 'r' THEN pg_catalog.to_char($1, 'HH12:MI:SS AM')
WHEN n = 'S' THEN pg_catalog.to_char($1, 'SS')
WHEN n = 's' THEN pg_catalog.to_char($1, 'SS')
WHEN n = 'T' THEN pg_catalog.to_char($1, 'HH24:MI:SS')
WHEN n = 'U' THEN pg_catalog.to_char($1, '?')
WHEN n = 'u' THEN pg_catalog.to_char($1, '?')
WHEN n = 'V' THEN pg_catalog.to_char($1, '?')
WHEN n = 'v' THEN pg_catalog.to_char($1, '?')
WHEN n = 'W' THEN pg_catalog.to_char($1, 'FMDay')
WHEN n = 'w' THEN EXTRACT(DOW FROM $1)::text
WHEN n = 'X' THEN pg_catalog.to_char($1, '?')
WHEN n = 'x' THEN pg_catalog.to_char($1, '?')
WHEN n = 'Y' THEN pg_catalog.to_char($1, 'YYYY')
WHEN n = 'y' THEN pg_catalog.to_char($1, 'YY')
WHEN n = '%' THEN pg_catalog.to_char($1, '%')
ELSE NULL END; temp := temp operator(pg_catalog.||) res; i := i + 2;
ELSE temp = temp operator(pg_catalog.||) c; i := i + 1;
END IF;
END LOOP;
RETURN temp;
END $$ IMMUTABLE STRICT LANGUAGE plpgsql;
其中一个 php 文件调用该过程,如下所示:
$sql = "SELECT date_format(c.date_commande,'%m') as dm, SUM(c.".$this->field.")";
我提议的工作是否过于天真?有没有更好的方法来解决这个问题?谢谢你。
解决方案
我相信您使用 PHP 的方法似乎是合理的,因为我不使用 PHP 进行开发。
但是,使用 CockroachDB builtin 可能更容易experimental_strftime
。
见这里:https ://www.cockroachlabs.com/docs/v21.1/functions-and-operators#date-and-time-functions
推荐阅读
- c++ - 将高维向量投影到低维时出错
- ios - iOS 13 SceneDelegate 上的 WKWebView 警报崩溃
- build - 使用 @babel/preset-env 和 useBuiltIns:'usage' 时,是否需要导入 core-js/stable 和 regenerator-runtime/runtime?
- authentication - asp.net core 3.1中基于租户注册认证方案
- c++ - 无法将“this”指针作为 C++ 中的默认变量传递给类方法参数
- amazon-web-services - 如何使用 greengrass env 上传 aws lambda 函数?
- android - Android:使用 Glide - DataBinding 设置占位符图像
- vuejs2 - 如何在 Vuetify 中去抖 v-autocomplete 过滤器功能?
- python - python导入随机问题-AttributeError:'builtin_function_or_method'对象没有属性
- azure - 具有目录映射的 Azure Blob 存储