下面是我的存储过程:

CREATE OR REPLACE PROCEDURE TCT_WEBAPP.DBO.GET_FILTERED_PAGINATION_PROVIDERS(
    "MONTH_START" VARCHAR(20), 
    "MONTH_END" VARCHAR(20), 
    "IP_FILTER" VARCHAR(100), 
    "PROPOSALS_TABLE_NAME" VARCHAR(100),
    "TIER" VARCHAR(20),
    "CITY" VARCHAR(20),
    "TYPE" VARCHAR(20),
    "PAGE_OFFSET" INTEGER,
    "PAGE_SIZE" INTEGER
)
RETURNS TABLE (
    "PROVIDERNAMEADJUSTED" VARCHAR(250), 
    "PROVIDERTYPEADJUSTED" VARCHAR(250), 
    "PROVIDERCITYADJUSTED" VARCHAR(250), 
    "STANDARDTIER" VARCHAR(250), 
    "TOTALACTUALCOST" FLOAT, 
    "TOTALCHANGE" FLOAT, 
    "TOTALCHANGEPERCENT" FLOAT
)
LANGUAGE SQL
EXECUTE AS OWNER
AS
'
DECLARE
    res RESULTSET DEFAULT (
        SELECT 
            PROVIDER.PROVIDERNAMEADJUSTED, 
            PROVIDER.PROVIDERTYPEADJUSTED, 
            PROVIDER.PROVIDERCITYADJUSTEDGROUP, 
            PROVIDER.STANDARDTIER, 
            SUM(PROPOSAL_CLAIMS.ACTUALCOST) AS TOTALACTUALCOST, 
            SUM(PROPOSAL_CLAIMS.CHANGE) AS TOTALCHANGE, 
            SUM(PROPOSAL_CLAIMS.CHANGE) / SUM(PROPOSAL_CLAIMS.ACTUALCOST) * 100 AS TOTALCHANGEPERCENT
        FROM 
            (
                SELECT 
                    c.PROGRAMNAME, 
                    c.PROGRAMTPA, 
                    c.PROVIDERCODE, 
                    c.SERVICECODE, 
                    c.NOOFUNITS, 
                    c.ACTUALCOST, 
                    c.INCURRALMONTHBRACKET, 
                    c.CLAIMTYPEIBNR, 
                    p.CLEANEDPROPOSAL, 
                    p.CLEANEDPROPOSAL * c.NOOFUNITS AS PROPOSEDCOST, 
                    PROPOSEDCOST - c.ACTUALCOST AS CHANGE 
                FROM 
                    CLAIMSDATATCT c 
                INNER JOIN 
                    TABLE(:PROPOSALS_TABLE_NAME) p ON c.SERVICECODE = p.SERVICECODE 
                WHERE 
                    c.INCURRALMONTHBRACKET >= TO_NUMBER(:MONTH_START) 
                    AND c.INCURRALMONTHBRACKET <= TO_NUMBER(:MONTH_END) 
                    AND c.CLAIMTYPEIBNR NOT LIKE 
                        CASE WHEN LOWER(:IP_FILTER) = ''exclude ip'' THEN ''Inpatient'' END
            ) AS PROPOSAL_CLAIMS
        LEFT JOIN 
            (
                SELECT 
                    programname, 
                    programtpa, 
                    providernameadjusted, 
                    providercode,
                    CASE WHEN lower(providercityadjustedgroup) = ''northern emirates'' THEN ''NE'' ELSE providercityadjustedgroup END AS providercityadjustedgroup, 
                    standardtier, 
                    CASE WHEN providertypeadjusted ILIKE ''hospital'' THEN ''Hospital'' ELSE ''Clinic'' END AS providertypeadjusted
                FROM 
                    tct_webapp.dbo.Map_Provider 
                WHERE 
                    lower(standardtier) = lower(:TIER)
                    AND lower(providercityadjustedgroup) = lower(:CITY)
                    AND lower(providertypeadjusted) = lower(:TYPE)
            ) AS PROVIDER 
        ON 
            PROPOSAL_CLAIMS.PROGRAMNAME = PROVIDER.PROGRAMNAME 
            AND PROPOSAL_CLAIMS.PROGRAMTPA = PROVIDER.PROGRAMTPA 
            AND PROPOSAL_CLAIMS.PROVIDERCODE = PROVIDER.PROVIDERCODE 
        GROUP BY 
            PROVIDER.PROVIDERNAMEADJUSTED, 
            PROVIDER.PROVIDERTYPEADJUSTED, 
            PROVIDER.PROVIDERCITYADJUSTEDGROUP, 
            PROVIDER.STANDARDTIER
         LIMIT :PAGE_SIZE
    );
BEGIN
    RETURN TABLE(res);
END;
';

我试着把它叫作

CALL GET_FILTERED_PAGINATION_PROVIDERS('202201', '202212', 'Exclude IP', 'Proposals_igor', 'Tier 1', 'Dubai', 'Clinic', 15, 15);

为什么我会收到这个错误:

错误行59在位置25处出现意外的'::'.(第59行)

我查过了,LIMIT美元的声明肯定有问题.但我不明白是什么.当我把它取下来时,一切都很好.

如果使用像10这样的硬编码值,它也可以正常工作.但这不适用于一个论点.我做错了什么?

推荐答案

这个简化的存储过程会产生相同的错误:

CREATE OR REPLACE PROCEDURE TEST_LIMIT(PAGE_SIZE INTEGER)
RETURNS TABLE (N INTEGER)
LANGUAGE SQL
AS '
DECLARE
    res RESULTSET DEFAULT (
        SELECT 1
        LIMIT :PAGE_SIZE
    );
BEGIN
    RETURN TABLE(res);
END;
';

call test_limit(3);

-- syntax error line 2 at position 24 unexpected '::'. (line 2837)

一个可能的解决方案是使用查询来合成字符串:

CREATE OR REPLACE PROCEDURE TEST_LIMIT(PAGE_SIZE INTEGER)
RETURNS TABLE (N INTEGER)
LANGUAGE SQL
AS 
DECLARE
    stmt VARCHAR DEFAULT 'SELECT 1
        LIMIT ' || :PAGE_SIZE;
    res RESULTSET DEFAULT (EXECUTE IMMEDIATE :stmt);
BEGIN
    RETURN TABLE(res);
END;
;

call test_limit(3);

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

如何在一个范围内进行分组.""范围值在范围表中定义

在SQL中将相同且紧挨着的元素进行分组

更新PostgreSQL 15中的JSON值

如何更新SQLite数据库中的表?

使用多个嵌套数组查询JSON数据

在Oracle SQL中按月生成日期

将用户授予另一个用户不授予权限

按行值出现的顺序对行值进行分组

YEAR 函数仍然不可SARGable 吗?

删除每个不同日期中未 Select 的最短最长时间

基于变量的条件 WHERE 子句

使用SQLAlchemy和Postgres数据库创建新行时,为什么我的创建日期比更新日期晚?

PostgreSQL - 从同一张表中获取值

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

交叉应用 OPENJSON / PIVOT - 错误的顺序

按 15 分钟递增计数分组,包括 0 计数

pyspark 将列转换为行

遍历数据,计算每个月最后三天的总和