2016-04-24 4 views
2

私はJSONをサポートするpostgresqlで関数を作っています。挿入クエリでbigintデータがないのにうまくいきますが、データベーステーブルのbigintデータ型であるcheck_number.there列にbigintデータがある間は失敗します。次のように pgsqlの中に私の機能は次のとおりです。bigintはJSONでサポートしていません

CREATE OR REPLACE FUNCTION transactions.post_transaction(
    tran_ json, 
    detail_ json, 
    share_tran_ json) 
    RETURNS bigint[] AS 
$BODY$ 
    DECLARE r   transactions.tran_type; 
    DECLARE _tran_id bigint; 
    DECLARE _tran_ids bigint[]; 
BEGIN 

    FOR r IN SELECT * FROM json_populate_recordset(null::transactions.tran_type, $1) 
    LOOP 

     INSERT INTO transactions.transactions(
      office_id, tran_date, value_date, book_name, collector_id, 
      total_amount, teller_id, is_auto_payment, is_compounded, is_flagged, instrument_id, 
      instrument_number, verification_status_id, verified_by_user_id, audit_user_id, collection_sheet_id, 
      loan_receipt_id, loan_reimburse_id, cash_transfer_id, remittance_id, standing_instruction_id, ibt_tran_id 
     ) 
     SELECT r.office_id, r.tran_date, r.value_date, r.book_name, r.collector_id, 
      r.total_amount, r.teller_id, r.is_auto_payment, r.is_compounded, false, r.instrument_id, 
      r.instrument_number, r.verification_status_id, r.verified_by_user_id, r.teller_id, r.collection_sheet_id, 
      r.loan_receipt_id, r.loan_reimburse_id, r.cash_transfer_id, r.remittance_id, r.standing_instruction_id, r.ibt_tran_id; 

     SELECT CURRVAL('transactions.transactions_tran_id_seq') INTO _tran_id; 
     IF _tran_ids IS NULL THEN 
     _tran_ids := array[_tran_id]; 

     ELSE 
      _tran_ids := _tran_ids || _tran_id; 
     END IF; 


     INSERT INTO transactions.transaction_details(
      tran_id, account_number_id, loan_id, gl_account_id, share_account_id, repository_id,is_interest, 
      slip_number, check_number, is_loan_collection, debit, credit, statement_reference, audit_user_id, deno_id, ref_dep_ac_id) 

     SELECT _tran_id, td.account_number_id, td.loan_id, td.gl_account_id, td.share_account_id, td.repository_id, td.is_interest, 
      td.slip_number, td.check_number, td.is_loan_collection, td.debit, td.credit, td.statement_reference, r.teller_id, td.deno_id, td.ref_dep_ac_id 
     FROM json_populate_recordset(null::transactions.tran_detail_type, $2) td 
     WHERE td.office_id = r.office_id; 

     INSERT INTO transactions.share_transaction(tran_id, share_account_id, kitta_from, kitta_to, audit_user_id) 
     SELECT tran_id, share_account_id, kitta_from, kitta_to, audit_user_id 
     FROM json_populate_recordset(null::transactions.share_tran_type, null) s 
     WHERE s.office_id = r.office_id; 
    END LOOP; 

    RETURN _tran_ids; 
END 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION transactions.post_transaction(json, json, json) 
    OWNER TO postgres;} 

JSON取引からクエリ

SELECT *を次のように返します。「ibt_tran_id」: 「ibt_tran_id」:01000057、「book_name」: :nullは、 "INSTRUMENT_ID":ヌル、 "instrument_number":ヌル、 "is_auto_payment":ヌル、 "is_compounded":ヌル、 "is_flagged":偽、 "loan_receipt_id":ヌル、 "loan_reimburse_id":ヌル、 "office_id": 3、 "REFERENCE_NUMBER": "8001061713"、 "remittance_id":ヌル、 "standing_instruction_id":ヌル、 "statement_reference":ヌル、 "teller_id":13000057、 "TOTAL_AMOUNT":15000、 "tran_date": "4月22日/ 2016 12:00:00 AM "、" tran_id ":0、" value_date ":" 4/22/2016 12:00:00 AM "、" verification_status_id ":1、 " verified_by_user_id ":0}、{" audit_user_id ":13000057、" book_name ":"引落 "、" cash_transfer_id ":null、" collection_sheet_id ":null、" collector_id ":15000089、 " flagged_by_user_id ":nu LL、 "ibt_tran_id":ヌル、 "INSTRUMENT_ID":ヌル、 "instrument_number":ヌル、 "is_auto_payment":ヌル、 "is_compounded":ヌル、 "is_flagged":偽、 "loan_receipt_id":ヌル、 "loan_reimburse_id":ヌル、 "office_id":16、 "REFERENCE_NUMBER": "8001061713"、 "remittance_id":ヌル、 "standing_instruction_id":ヌル、 "statement_reference":ヌル、 "teller_id":13000057、 "TOTAL_AMOUNT":15000、 "tran_date": "4/22/2016 12:00:00 AM"、 "tran_id":0、 "value_date": "4/22/2016 12:00:00 AM"、 "verification_status_id":1、 "verified_by_user_id":0 「デシビット」:15000、「decimal_value」):)、)、(クレジット):null、 "デビット":"loan_days":null、 "loan_id":0、 "deno_id":null、 "gl_account_id":4849、 "interest_rate":null、 "is_interest":false、 "is_loan_collection":false、 "is_overdraft" :null、 "loan_receipt_type":null、 "office_id "0、" transaction_detail_id ":0}":3、 "ref_dep_ac_id":null、 "repository_id":null、 "share_account_id":null、 "slip_number":null、 "statement_reference": "by self"、 "tran_id" 、 "de_bit":null、 "account_number_id":null、 "audit_user_id":13000057、 "check_number":null、 "credit":15000、 "debit":null、 "decimal_value":0、 "deno_id":null 、 "gl_account_id":4797、 "interest_rate":ヌル、 "is_interest":偽、 "is_loan_collection":偽、 "is_overdraft":ヌル、 "loan_days":ヌル、 "loan_id":ヌル、 "loan_receipt_type":ヌル、 "office_id":3、 "ref_dep_ac_id":null、 "repository_id":null、 "share_account_id":null、 "slip_number":null、 "statement_reference": "by self"、 "tran_id":0、 "transaction_detail_id" "check_number":null、 "credit":null、 "debit":15000、 "decimal_value":0、 "deno_id":null、 "account_number_id":null、 "audit_user_id":13000057、 "check_number" :null、 "gl_account_id":4801、 "inter est_rate ":ヌル、" is_interest ":偽、 "is_loan_collection":偽、" is_overdraft ":ヌル、" loan_days ":ヌル、" loan_id ":ヌル、" loan_receipt_type ":ヌル、" office_id ":16、" ref_dep_ac_id ";" 13019905、 "repository_id":null、 "share_account_id":null、 "slip_number":null、 "statement_reference": "自己"、 "tran_id":0、 "transaction_detail_id":0}、{"account_duration" null、 "account_number_id":null、 "audit_user_id":13000057、 "check_number":null、 "credit":15000、 "debit":null、 "decimal_value":0、 "deno_id":null、 "gl_account_id":4781 "loan_days":null、 "loan_id":null、 "loan_receipt_type":null、 "office_id":16、 "loan_days":null、 "interest_rate":null、 "is_interest":false、 "is_loan_collection":false、 "is_overdraft" "ref_dep_ac_id":null 、 "repository_id":79、 "share_account_id":null、 "slip_number":null、 "statement_reference": "by self"、 "tran_id":0、 "transaction_detail_id":0}] ')) 、 (('ヌル')));

+0

をあなたが見ているエラーメッセージは何ですか? –

+0

エラー:値 "8001061713"が整数型の範囲外です。このエラーはcheck_numberカラムにありますbigintデータ型を定義するにはどうすればいいですか –

+0

'transactions.transaction_details'で定義されている型は何ですか?そのテーブルにcheck_numberを挿入しています。これは問題の可能性があります。 –

答えて

3

わかりましたので、問題はjson_populate_recordset(null::transactions.tran_detail_type, $2)かもしれません。これは、この特定のjsonデータを使用する唯一の場所です。

これは、transactions.tran_detail_typeでは、check_numberが整数として宣言され、bigintではないことを意味します。私はそれが正しい得た場合

これはそれを修正する必要があります

ALTER TABLE transactions.tran_detail_type ALTER COLUMN check_number TYPE bigint; 
関連する問題