Saya mempunyai program mysql yang mempunyai parameter keluar dan beberapa pernyataan cetakan untuk penyahpepijatan. Saya memanggil prosedur ini daripada skrip shell Unix dan ideanya adalah untuk menetapkan parameter keluar kepada pembolehubah unix yang saya gunakan untuk menyemak keadaan kemudian. Tetapi pembolehubah mendapat penyata cetakan untuk diberikan juga. Saya mahu menyingkirkan kenyataan cetakan dan hanya menetapkan parameter output (integer) kepada pembolehubah.
Skrip Unix:
output_var=`mysql -sN test_db -e "call delete_me(@outs);select @outs"` echo $output_var
Juga memberikan penyata cetakan
proc started proc ended 1043
Apabila saya menjalankan kod dalam klien SQL seperti DBeaver..saya hanya mendapat parameter output..
call delete_me(@out);select @out
@out ---- 1043
Saya tidak mahu melumpuhkan kenyataan cetak/nyahpepijat kerana ia berguna untuk log saya. Tetapi saya tidak mahu mereka muncul dalam pembolehubah keluar mysql dan akhirnya pembolehubah unix saya juga.
Ini adalah program mysql
CREATE PROCEDURE `delete_me`(out success int) BEGIN DECLARE var1 INT; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SHOW ERRORS; ROLLBACK; SET success=1; END; START TRANSACTION; select max(run_id) into var1 from job_run; select 'proc started'; select 'proc ended'; SET success:= var1; END;
Memandangkan pernyataan "debug" menghasilkan stdout, dan
select @out;
juga menghasilkan stdout, klien MySQL tidak boleh membezakan antara mereka. Proses ini tidak mempunyai fungsi ubah hala keluaran.Jadi anda perlu berfikir secara kreatif.
Satu idea ialah memastikan penyataan penyahpepijatan anda mempunyai beberapa corak biasa supaya anda boleh menapisnya. Contohnya, gunakan perkataan "#DEBUG" secara konsisten.
Kemudian tapis apabila memanggilnya daripada Bash:
Idea lain ialah menukar kod supaya pernyataan nyahpepijat dikeluarkan hanya dengan syarat.
Jadi jika anda mahukan output debug, anda boleh memanggilnya seperti ini:
Jika anda tidak memerlukan output nyahpepijat, jangan tetapkan
@debug=1
.Perkara yang paling penting ialah prosedur tersimpan MySQL benar-benar menyusahkan dalam banyak situasi. Tiada penyahpepijat sebenar, tiada pakej, tiada pengkompil, tiada perpustakaan standard, tiada penggunaan atom, dsb. Saya telah menggunakan MySQL selama bertahun-tahun, tetapi saya telah melihat sangat sedikit kegunaan yang baik untuk program ini.
Andaian:
select @out
ditunjukkan pada baris berasingan (seperti dalam soalan asal OP)Kita akan mulakan dengan salinan kaedah semasa OP untuk menangkap semua output kepada pembolehubah:
Untuk menambah semua kecuali baris terakhir ke fail log:
Untuk menangkap baris terakhir ke pembolehubah baharu: