我正在尝试使用.net核心调用存储过程。
我遇到了This问题。解决了先前的问题后,我又遇到了另一个语法错误。
PostgresException:42883:尝试调用过程时,功能GetActiveUserPackagesForOpenBillingPeriod(不带时区的时间戳)不存在
这是代码:
var date = DateTime.Now;
List<ActivePackageForOpenBillingPeriod> activeUserPackagesForOpenBillingPeriod = null;
using (var conn = new NpgsqlConnection ("Host=localhost;Port=xxx;Database=postgres;Username=postgres;Password=xxx;TrustServerCertificate=true;ApplicationName=xxx;"))
{
var s = "Select * FROM \"GetActiveUserPackagesForOpenBillingPeriod\"({0})";
activeUserPackagesForOpenBillingPeriod = context.ActivePackageForOpenBillingPeriods.FromSql (s, date).ToList ();
}
存储过程
create or replace function "GetActiveUserPackagesForOpenBillingPeriod"(somedate timestamp without time zone) returns TABLE("Amount" numeric, "Package" integer, "User" integer, "Account" integer, "AcceptanceActID" integer, "HasChangedPackage" boolean)
language plpgsql
as
$$
DECLARE
BEGIN
RETURN QUERY
SELECT
up."TotalAmount",
up."PackageID",
u."ID" AS "UserId",
a."ID" AS "AccountId",
th."AcceptanceActID",
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",th."AcceptanceActID";
RETURN;
END;
$$;
alter function "GetActiveUserPackagesForOpenBillingPeriod"(timestamp)
owner
to postgres;
班级
public class ActivePackageForOpenBillingPeriod {
public int Id { get; set; }
public int AccountID { get; set; }
[ForeignKey ("AccountID")]
public Account Account { get; set; }
public int UserID { get; set; }
[ForeignKey ("UserID")]
public User User { get; set; }
public int PackageID { get; set; }
[ForeignKey ("PackageID")]
public Package Package { get; set; }
public decimal TotalAmount { get; set; }
public bool HasChangedPackage { get; set; }
}
答案 0 :(得分:1)
我通过使用
解决了这个问题> @DateFrom :: DATE
代码如下。我使用 Dapper 调用该函数。
Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
var f = _connection.Query<GeneralLedgerForSubsidyAccount>(@"
SELECT * FROM
edudb.Fn_General_Ledger_Subsidy_Account
(@SearchType, @DateFrom::DATE, @DateTo::DATE, @OpeningBalanceIncludeORExcluding, @ChartOfAccountsId)
",
new
{
SearchType = search.SearchType,
DateFrom = search.DateFrom.Date,
DateTo = search.DateTo.Date,
OpeningBalanceIncludeORExcluding = search.OpeningBalanceIncludeORExcluding,
ChartOfAccountsId = search.ChartOfAccountsId
}).ToList();
我的函数定义如下
CREATE OR REPLACE FUNCTION edudb.Fn_General_Ledger_Subsidy_Account
(
Search_Type character varying(50),
date_from DATE,
date_to DATE,
Opening_Balance_Include_Or_Exclude character varying(50),
chart_of_accounts_id_p INTEGER
)
答案 1 :(得分:0)
不要使用timestamp参数,必须使用varchar参数。 然后在存储过程中,更改时间戳记的类型varchar。