Postgresql 返回的类型字符(70)[]与预期类型不匹配

Postgresql 返回的类型字符(70)[]与预期类型不匹配,postgresql,Postgresql,我需要帮助来查看以下查询, 我的表格如下: CREATE TABLE "MasterDivision" ( "DivisionID" bigserial NOT NULL, "DivisionName_EN" character varying(70) NOT NULL, "DivisionName_HI" character varying(70) NOT NULL, "DivisionCode" character varying(70) NOT NULL,

我需要帮助来查看以下查询, 我的表格如下:

CREATE TABLE "MasterDivision"
(
    "DivisionID" bigserial NOT NULL,
    "DivisionName_EN" character varying(70) NOT NULL,
    "DivisionName_HI" character varying(70) NOT NULL,
    "DivisionCode" character varying(70) NOT NULL,
    "StateID" bigint NOT NULL,
    "CreatedBy" bigint NOT NULL,
    "UpdatedBy" bigint NOT NULL,
    "CreatedIP" character varying(50) NOT NULL,
    "UpdatedIP" character varying(70) NOT NULL,
    "IsActive" boolean NOT NULL,
    "CreationDate" date NOT NULL,
    "UpdationDate" date NOT NULL,
    CONSTRAINT "PK_MasterDivision_DivisionID" PRIMARY KEY ("DivisionID")
)
WITH (
    OIDS=FALSE
);
ALTER TABLE "MasterDivision"
OWNER TO postgres;
GRANT ALL ON TABLE "MasterDivision" TO public;
GRANT ALL ON TABLE "MasterDivision" TO postgres;
我创建了以下自定义类型:

create type type_selectmasterdivisionwithpagging
as
(
    row bigint,
    DivisionID bigint,
    DivisionName_EN character varying(70),
    DivisionName_HI character varying(70),
    DivisionCode character varying(70),
    StateID bigint,
    StateName_EN character varying(70),
    StateName_HI character varying(70)

);
下面的函数

CREATE OR REPLACE FUNCTION selectmasterdivisionwithpagging("PageNumber" integer, "PageSize" integer, "WhereClause" text, "OrderByClause" text)
RETURNS SETOF type_selectmasterdivisionwithpagging AS
$BODY$declare 
    _SQL text;      
Begin   
IF $1 <> -1 and $2 <> -1  then

_SQL:='Select * ' ||
      'from ' ||
      '( ' ||
        'SELECT ROW_NUMBER() OVER ('|| $4 ||' ) AS Row' ||
            ',MD."DivisionID" ' ||
            ',MD."DivisionName_EN" '||
            ',MD."DivisionName_HI" '||
            ',MD."DivisionCode" '||
            ',MD."StateID" '||
            ',MS."StateName_EN" '||
            ',MS."StateName_HI" '||
        'from "MasterDivision" as MD ' ||
        'left join "MasterState" as MS ' ||
        'on MD."StateID"=MS."StateID" ' ||
        $3 ||

      ' ) as t' ||
      ' where 1=1 and t.Row between ' || ((($1-1)*$2)+1)||' and ' || ($1*$2) ;

    RETURN query execute _SQL;              
else        
    RETURN query execute    'SELECT ROW_NUMBER() OVER ('|| $4 ||' ) AS Row' ||
                    ',MD."DivisionID" ' ||
                    ',MD."DivisionName_EN" '||
                    ',MD."DivisionName_HI" '||
                    ',MD."DivisionCode" '||
                    ',MD."StateID" '||
                    ',MS."StateName_EN" '||
                    ',MS."StateName_HI" '||
                'from "MasterDivision" as MD ' ||
                'left join "MasterState" as MS ' ||
                'on MD."StateID"=MS."StateID" ';
end IF;
end;$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100
ROWS 1000;
ALTER FUNCTION selectmasterdivisionwithpagging(integer, integer, text, text)
OWNER TO postgres;
创建或替换函数SelectMasterDivision with Pagging(“PageNumber”整数、“PageSize”整数、“WhereClause”文本、“OrderByClause”文本)
返回类型为的集合,分页为
$BODY$declare
_SQL文本;
开始
如果是$1-1和$2-1,那么
_SQL:=“选择*”||
“来自”||
'( ' ||
“选择(“| |$4 | |”)上方的行_NUMBER()作为行”||
“,MD.“部门ID”||
,MD.“部门名称”||
医学博士“部门名称”||
马里兰州“部门代码”||
“,MD.“StateID”||
“,StateName_EN”女士”||
“,StateName_HI”女士”||
'从“MasterDivision”担任总经理'||
'左加入“MasterState”为MS'||
'on MD.“StateID”=MS.“StateID”'||
$3 ||
“)作为t”||
式中,1=1,t.介于“| |”(($1-1)*$2)+1)| |”和“| |”($1*$2)之间的行;
返回查询执行SQL;
其他的
返回查询执行“选择(“| |$4 | |”)上的行作为行”||
“,MD.“部门ID”||
,MD.“部门名称”||
医学博士“部门名称”||
马里兰州“部门代码”||
“,MD.“StateID”||
“,StateName_EN”女士”||
“,StateName_HI”女士”||
'从“MasterDivision”担任总经理'||
'左加入“MasterState”为MS'||
'on MD.“StateID”=MS.“StateID”';
如果结束;
结束$身体$
语言plpgsql不可变
100美元
第1000行;
ALTER函数SelectMasterDivision带分页(整数、整数、文本、文本)
博士后的所有者;
以上所有查询都执行得很好,但当我使用
选择selectmasterdivisionwithpagging(1,2,'其中1=1','Order by MS.“StateName_EN”')
时,它会给出错误:

错误:查询的结构与函数结果类型不匹配
详细信息:返回的类型字符变化(70)[]与第7列中的预期类型字符变化(70)不匹配。

如果需要更多信息,请告诉我。 谢谢大家

  • 如果不需要,请停止使用
    EXECUTE
    。如果需要,请使用参数化表单。当前函数容易受到各种函数内sql注入的攻击

  • 停止编写依赖SQL注入漏洞工作的函数。如果我把where子句
    '1=1;从“MasterDivision”中删除--'然后你会得到一个非常糟糕的惊喜

  • 您的错误意味着
    “MasterState”。“StateName\u EN”
    不是您认为的类型。在那里检查。在我看来,您可能将其作为varchar(70)[]而不是varchar字段

  • 如果不需要,请停止使用
    EXECUTE
    。如果需要,请使用参数化表单。当前函数容易受到各种函数内sql注入的攻击

  • 停止编写依赖SQL注入漏洞工作的函数。如果我把where子句
    '1=1;从“MasterDivision”中删除--'然后你会得到一个非常糟糕的惊喜

  • 您的错误意味着
    “MasterState”。“StateName\u EN”
    不是您认为的类型。在那里检查。在我看来,您可能将其作为varchar(70)[]而不是varchar字段


  • 首先,请用
    %I
    标识符说明符和
    using
    子句使用
    格式(…)
    重写该动态查询;它使它的可读性大大提高,特别是如果您使用多行引号,如
    $sql$SELECT blah blah$sql$
    。确切的错误告诉我,您正在返回一个数组,其中需要一个标量
    varchar
    。您能显示
    “MasterState”
    表的结构吗?因为我与团队一起工作,其中一位成员不理解字符变化()和字符变化()之间的区别[]这就是我出错的原因,这让我的思维扭曲了..谢谢..首先,请用
    %i
    标识符说明符和
    using
    子句使用
    格式(…)
    重写动态查询;它使它的可读性大大提高,特别是如果您使用多行引号,如
    $sql$SELECT blah blah$sql$
    。确切的错误告诉我,您正在返回一个数组,其中需要一个标量
    varchar
    。您能显示
    “MasterState”
    表的结构吗?因为我与团队一起工作,其中一位成员不理解字符变化()和字符变化()之间的区别[]这就是我出错的原因,这让我的思维扭曲了。谢谢。我可能遗漏了一些东西,但是你怎么知道是不是
    StateName\u EN
    没有匹配的类型呢?从我所看到的,它可能是
    StateName\u HI
    同样容易。除此之外,我同意你所有的观点。我可能遗漏了一些东西,但是你如何判断它是否是
    StateName\u EN
    没有匹配的类型?从我所看到的,它可能是
    StateName\u HI
    同样容易。除此之外,我同意你所有的观点。