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)( |
+---------------+--------------------------+-----------------------------------------+------------------+