【问题标题】:'syntax error at end of input' - while trying to launch stored procedure from DB'输入结束时的语法错误' - 尝试从数据库启动存储过程
【发布时间】:2019-10-21 01:57:31
【问题描述】:

我正在编写 .net 核心并尝试从数据库(Postgresql)启动存储过程。

我收到一条错误消息,提示“输入末尾存在语法错误”。 连接字符串是正确的(在调试过程中发现)。问题在于 .FromSql() 方法语法。

代码如下:

List<ActivePackageForOpenBillingPeriod> activeUserPackagesForOpenBillingPeriod =null;

        using(var conn = new NpgsqlConnection("Host=localhost;Port=xxx;Database=postgres;Username=xxx;Password=xxx;TrustServerCertificate=xxx;ApplicationName=xxx;"))
        {

            var s = "create function \"GetActiveUserPackagesForOpenBillingPeriod({0})\"";
            activeUserPackagesForOpenBillingPeriod = context.ActivePackageForOpenBillingPeriods.FromSql(s,DateTime.Now).ToList();
        }

这是我要调用的存储过程

    create function "GetActiveUserPackagesForOpenBillingPeriod"(date 
timestamp without time zone) returns TABLE("Amount" numeric, "Package" 
character varying, "User" text,"Account" int, "AcceptanceActID" int, 
"HasChangedPackage" boolean)
    language plpgsql
as
$$
DECLARE
    BEGIN
      RETURN QUERY
        SELECT
            a."ID" AS "AccountId",
            u."ID" AS "UserId",
            up."PackageID",
            up."TotalAmount",
            CASE
                  WHEN count(DISTINCT tl."PackageID") IN (0,1)  THEN false
                  ELSE true
            END AS "HasChangedPackage"

        FROM public."Accounts" as a
            LEFT JOIN billing."TransactionHeaders" AS th ON th."AccountID" = a."ID"
            INNER JOIN security."Users" AS u ON u."AccountID"= a."ID"
            INNER JOIN billing."UserPackages" AS up ON up."UserID"=u."ID" AND COALESCE(th."Date", date) BETWEEN up."StartDate" AND COALESCE(up."EndDate", date)
            LEFT JOIN billing."TransactionLines" AS tl ON th."Id" = tl."TransactionHeaderID"

        WHERE th."AcceptanceActID" IS NULL AND a."StatusID"!=4 AND a."StatusID"!=3 AND up."StatusID"=1


        GROUP BY a."ID", u."ID", up."PackageID", up."TotalAmount";

END;
$$;

【问题讨论】:

    标签: c# postgresql asp.net-core


    【解决方案1】:

    您正在运行的查询是错误的。它是函数创建语句和获取其结果的调用之间的混合。

    同样只有函数名应该被双引号,而不是参数

    将查询更改为

    var s = "SELECT * FROM \"GetActiveUserPackagesForOpenBillingPeriod\"({0})";
    

    【讨论】:

    • 做到了。我现在有一个不同的错误 - PostgresException: 42883: 函数 GetActiveUserPackagesForOpenBillingPeriod(timestamp without time zone) 不存在。那可能是参数问题吧?
    • @GugaTodua 找不到该功能的原因可能有多种。是创造出来的吗?调用它的用户是否具有execute 权限等。参数看起来很好(它在错误消息和函数定义中是相同的类型)
    • 我已经创建了一个函数并且我有执行权限。问题很可能是我传递的参数(DateTime.Now - 这是“06/06/2019 15:06:55”。
    【解决方案2】:

    您似乎缺少 RETURN;在您的功能结束时。它应该在 END 上方的行上;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-28
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2019-03-14
      • 2012-11-15
      相关资源
      最近更新 更多