2016-05-19 7 views
0

open cr_count行でエラーが発生したため、それに続く手順は機能しません。私はこの行なしでコードを実行すると細かく動作します。また、私はカーソルを使わずにクエリを書こうとしました。私はoracle sqlerrmとしてmysqlエラー・プリントを書いていませんでしたが、mysqlはその機能を持っていないと思います。MySqlストアドプロシージャは、内部カーソルのエラーのために機能しません。

delimiter $$ 

create procedure proc_payment(
    in p_transaction_guid varchar(200), 
    in p_card_type_id int, 
    in p_card_number varchar(100), 
    in p_billing_address varchar(500), 
    in p_flight_id int, 
    in p_flight_date date, 
    in p_cabin_class_id int, 
    in p_identity_number varchar(200) 
) 
begin 
    declare v_count   int; 
    declare v_payment_id  int; 
    declare v_passenger_id int; 
    declare v_booking_ref_id int; 

    declare cr_count cursor for 
    select count(1) 
    from tbl_passenger 
    where identity_number = p_identity_number; 

    declare cr_passenger cursor for 
    select passenger_id 
    from tbl_passenger 
    where identity_number = p_identity_number; 

    open cr_count; 
    fetch cr_count into v_count; 
    close cr_count; 

    if v_count = 0 then 
    insert into tbl_passenger (
     firstname, 
     lastname, 
     gender, 
     birthdate, 
     identity_number 
    ) 
    select 
     firstname, 
     lastname, 
     gender_id, 
     birthdate, 
     identity_number 
    from 
     v_booking_transaction 
    where 
     transaction_guid = p_transaction_guid 
     and identity_number = p_identity_number; 

    select last_insert_id() into v_passenger_id; 
    else 
    open cr_passenger; 
    fetch cr_passenger into v_passenger_id; 
    close cr_passenger; 
    end if; 

    insert into tbl_payment (
    card_type_id, 
    card_number, 
    payment_date, 
    billing_address 
) values (
    p_card_type_id, 
    p_card_number, 
    current_date(), 
    p_billing_address 
); 

    select last_insert_id() into v_payment_id; 

    insert into tbl_flight_booking (
    flight_id, 
    flight_date, 
    cabin_class_id, 
    payment_id 
) values (
    p_flight_id, 
    p_flight_date, 
    p_cabin_class_id, 
    v_payment_id 
); 

    select last_insert_id() v_booking_ref_id; 

    insert into tbl_flight_passenger (
    flight_id, 
    booking_reference_id, 
    passenger_id 
) values (
    p_flight_id, 
    v_booking_ref_id, 
    v_passenger_id 
); 
end$$ 
+0

オープンしないでフェッチするとエラーは発生しませんか? – Uueerdo

+0

カーソルが閉じている場合、またはオープン、フェッチ、クローズの行を削除すると、プロシージャは細かく動作します。プロシージャは、カーソル(cr_count)内の選択クエリのエラーのために動作しませんが、そのエラーは何ですか、残念ながら私did'ntは詳細を見つける。 –

+0

エラートレースの観点から見ると、mysqlは私の意見では悪い –

答えて

0

おそらくこの場合はカーソルを避けることができます。次のように動作するはずです:

delimiter $$ 

create procedure proc_payment(
    in p_transaction_guid varchar(200), 
    in p_card_type_id int, 
    in p_card_number varchar(100), 
    in p_billing_address varchar(500), 
    in p_flight_id int, 
    in p_flight_date date, 
    in p_cabin_class_id int, 
    in p_identity_number varchar(200) 
) 
begin 
    declare v_passenger_id, 
      v_payment_id, 
      v_booking_ref_id int; 

    select 
    passenger_id into v_passenger_id 
    from 
    tbl_passenger 
    where 
    identity_number = p_identity_number; 

    if v_passenger_id is null then 
    insert into tbl_passenger (
     firstname, 
     lastname, 
     gender, 
     birthdate, 
     identity_number 
    ) 
    select 
     firstname, 
     lastname, 
     gender_id, 
     birthdate, 
     identity_number 
    from 
     v_booking_transaction 
    where 
     transaction_guid = p_transaction_guid 
     and identity_number = p_identity_number; 
    set v_passenger_id := last_insert_id(); 
    end if; 

    insert into tbl_payment (
    card_type_id, 
    card_number, 
    payment_date, 
    billing_address 
) values (
    p_card_type_id, 
    p_card_number, 
    current_date(), 
    p_billing_address 
); 
    set v_payment_id := last_insert_id(); 

    insert into tbl_flight_booking (
    flight_id, 
    flight_date, 
    cabin_class_id, 
    payment_id 
) values (
    p_flight_id, 
    p_flight_date, 
    p_cabin_class_id, 
    v_payment_id 
); 
    set v_booking_ref_id := last_insert_id(); 

    insert into tbl_flight_passenger (
    flight_id, 
    booking_reference_id, 
    passenger_id 
) values (
    p_flight_id, 
    v_booking_ref_id, 
    v_passenger_id 
); 
end$$ 

delimiter ; 
+0

ありがとう@wchiquito、私はあなたの解決策を試みたが、残念なことに。私はoutパラメータを追加し、p_identity_numberを設定するとパラメータが機能しませんでした。 set p_out:= p_identity_numberを除くすべてのコンテンツを削除すると、細かく動作しました。魅力的な.. –

関連する問題