Sql 结构查询与结果类型不匹配

Sql 结构查询与结果类型不匹配,sql,postgresql,Sql,Postgresql,我尝试使用以下代码创建存储过程: CREATE OR REPLACE FUNCTION public.get_paycheck(empl_id varchar, lmt integer, offst integer) RETURNS TABLE( request_id varchar , nip varchar , email varchar , request_date timestamp with time zone

我尝试使用以下代码创建存储过程:

CREATE OR REPLACE FUNCTION public.get_paycheck(empl_id varchar, lmt integer, offst integer)
RETURNS TABLE(
        request_id varchar
        , nip varchar
        , email varchar
        , request_date timestamp with time zone 
        , salary_month date
        , salary_year float
        , status integer
        , created_time timestamp with time zone)
language plpgsql stable
as $function$
        BEGIN       
        return query

                select
                trp.request_id
                ,e.nip
                ,trp.email
                ,trp.request_date
                ,trp.salary_month
                ,date_part('year', trp.salary_month)
                ,trps.status
                ,trps.created_time
                from tr_request_paycheck trp
                join tr_request_paycheck_status trps on trps.request_id = trp.request_id
                join ms_empl e on e.empl_id = trp.empl_id
                    where case 
                            when $1 is not null and $1 <> '' then trp.empl_id = $1
                            else true
                        end


                group by 1,2,3,4,5,6,7,8
                LIMIT $2
                OFFSET $3;

        end;
    $function$;
创建或替换函数public.get_paycheck(emp_id varchar、lmt integer、offst integer)
返回表(
请求\u id varchar
,nip varchar
,电邮:varchar
,请求带有时区的日期时间戳
,月薪日
,年薪浮动
,状态整数
,已创建(带时区的时间戳)
语言plpgsql稳定
作为$function$
开始
返回查询
选择
trp.request\u id
,e.nip
,trp.email
,trp.request\u日期
,trp.salary\u月
,日期部分('年',培训工资部分('月))
,trps.status
,trps.created_time
从TRU请求trp支付支票
在trps.request\u id=trp.request\u id上加入trp\u request\u paycheck\u status trps
在e.emp\u id=trp.emp\u id上加入ms\u emp e
在哪里
如果$1不为null且$1'',则trp.emp_id=$1
否则是真的
终止
按1,2,3,4,5,6,7,8分组
限额2美元
抵销3美元;
终止
$function$;
每当我执行它时,我都会得到一个错误

结构查询与结果类型不匹配

即使我匹配了表中的所有类型


有人能帮我解决这个问题吗?

这就是我最终得到的结果:

  • 问题在于函数中的created_Time(时间戳w/tz)与SQL中的created_Time(时间(8))与日期/时间(正如您在评论中提到的)
  • SQL ms_emp.nip(未定义)与函数nip(varchar)可能存在问题
  • 日期数据类型的奇数名称月工资(维护问题)
  • 工资\年双精度SQL vs函数中的浮动为什么是浮动?为什么不是int?我不想在我的年份里看到(意外地允许)小数点。。。那么转换为int


需要查看正在使用的表/列的ddl。在“选择”对话框中。此外,如果返回的所有值都为null,则可能需要显式地将一个或多个列转换为所需的数据类型。将年份存储为浮动似乎真的很奇怪。date\u part year似乎不会返回float数据类型。。它不会回来;它返回类型双精度。工资月将是一个日期数据类型似乎也很奇怪。。。第一个表和第二个表我刚刚意识到创建的时间的数据类型是不同的,它应该是timestamtz,而不是time,对吗?这是最主要的问题。我还可能关心
ms_emp.nip
我不知道它的数据类型,也可能不知道它的
Salary\u year
,因为它是视图中双精度结果的浮动。我书中的年份应该是int数据;我决不想在那里看到/允许有小数点。
+---------------+--------------------------+-----------------------------------------+------------------+
|    Column     |     Function Expects     |               You Passed                | Which is of type |
+---------------+--------------------------+-----------------------------------------+------------------+
| request_id    | varchar                  | tr_request_paycheck.request_ID          | Varchar(255)     |
| nip           | varchar*                 | ms_empl.nip                             | Undefined*        |
| email         | varchar                  | tr_request_paycheck.email               | varchar(255)     |
| request_date  | timestamp with time zone | tr_request_paycheck.request_date        | timestamptz(28)  |
| salary_month  | date                     | tr_request_paycheck.salary_month        | Date             |
| salary_year   | float                    | date_part('year', trp.salary_month)     | Double Precision |
| status        | integer                  | tr_request_paycheck_Status.status       | Int4             |
| created_time  | timestamp with time zone*| tr_request_paycheck_Status.Created_Time | Time(8)(          |
+---------------+--------------------------+-----------------------------------------+------------------+