postgresql - 从 SQL Server 到 Postgres
问题描述
我是 Postgresql 的新手;我以前只使用过 SQL Server,所以我试图将 ASP.NET MVC 应用程序迁移到 ASP.NET Core 3.0,并在此过程中用 PostgreSQL 替换 SQL Server,然后迁移到 Ubuntu。
谁能告诉我这里的查询有什么问题?
CREATE OR REPLACE PROCEDURE officekit.testsp (mode CHARACTER)
LANGUAGE plpgsql AS $plpgsql$
BEGIN
IF mode = 'test' THEN
SELECT a,b,c,d FROM testSchema.test;
END IF;
COMMIT;
END;
$plpgsql$;
解决方案
在您的代码中,几乎每一行都不好。
首先,如果您想在 Postgres 中编写存储过程,请从文档开始。MSSQL 中存储过程的概念与 Oracle、DB2 中的概念有很大不同,当然也与 Postgres 中的不同。Postgres 中的 PLpgSQL 类似于 Oracle 的 PL/SQL。最好的办法是忘记所有关于存储过程的知识并从头开始。
错误:
Postgres 中的过程不能返回数据 - 只有函数才能做到这一点 - 在您的示例中,您可能需要一个表函数。
CREATE OR REPLACE FUNCTION officekit.testsp(mode text) RETURNS TABLE(a text, b text, c text) AS $$ BEGIN IF mode = 'test' THEN RETURN QUERY SELECT test.a, test.b, test.c FROM test; END IF; END; $$ LANGUAGE plpgsql;
我个人不喜欢这种编程风格。函数不应该只是包装查询。许多重大的性能问题和架构问题都源于对这种可能性的不当使用,但这取决于上下文。
- 为什么要在那里提交?此代码不会对数据库进行任何更改。没有理由调用提交。
推荐阅读
- python - 使用 Ansible 从一行文本中提取两个字符串
- gcc - gcc 预处理输出的格式
- reactjs - React 函数式组件有大小限制吗?
- puppeteer - 剧作家 - 如何检查元素是否在视口中?
- r - 以 95% CI 重复回归进行估计
- c# - WPF 设计器在 Visual Studio 2015 中不可见
- laravel - Laravel 文件上传:未检测到文件
- r - 以与显示的顺序相同的顺序从一列分组数据中过滤不同值的列表
- swift - 选择 SWIFT/XCODE 时使用按钮递增
- javascript - 无法使用服务工作者缓存诸如 css、js 和图像之类的 CORS 资产