2017-08-15 81 views
1

我試圖創建下面的代碼的存儲過程:結構查詢不匹配的結果類型

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$; 

每當我執行它,我得到一個錯誤

結構查詢不匹配的結果類型

即使我匹配我的表中的所有類型。

任何人都可以幫我解決這個問題嗎?

+0

需要查看正在使用的表/列的ddl。在選擇。此外,如果返回的所有值都爲null,則可能需要顯式將一個或多個列轉換爲所需的數據類型。將年份存儲爲浮動看起來很奇怪。 date_part年似乎不會返回float數據類型..它不會返回;它返回類型雙精度。也似乎奇怪的是,工資月將是一個日期數據類型... – xQbert

+0

http://imgur.com/a/xVgOJ第一個表和第二個http://imgur.com/a/GVImk – PinballWizard

+0

我剛纔意識到數據類型created_time是不同的,它假設是時間戳,而不是時間 我是否正確? – PinballWizard

回答

1

這是我結束了:

  • 的問題是,在SQL時間與日期/時間(如您提及CREATED_TIME(時間戳W/TZ)函數VS CREATED_TIME((8)時間)評論)
  • 與SQL ms_empl.nip(不確定)與函數夾(VARCHAR)
  • 奇怪的名字salary_month的日期數據類型(維護的關注)
  • salary_year雙精度SQL VS浮在功能上爲什麼浮動可能問題?爲什麼不是int?我不希望看到(意外地允許)在我的一年小數......所以投爲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)(   | 
+---------------+--------------------------+-----------------------------------------+------------------+