首页 > 解决方案 > 从 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$;

标签: postgresqlstored-procedures

解决方案


在您的代码中,几乎每一行都不好。

首先,如果您想在 Postgres 中编写存储过程,请从文档开始。MSSQL 中存储过程的概念与 Oracle、DB2 中的概念有很大不同,当然也与 Postgres 中的不同。Postgres 中的 PLpgSQL 类似于 Oracle 的 PL/SQL。最好的办法是忘记所有关于存储过程的知识并从头开始。

错误:

  1. 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; 
    

我个人不喜欢这种编程风格。函数不应该只是包装查询。许多重大的性能问题和架构问题都源于对这种可能性的不当使用,但这取决于上下文。

  1. 为什么要在那里提交?此代码不会对数据库进行任何更改。没有理由调用提交。

推荐阅读