Rumah > Soal Jawab > teks badan
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;
P粉2036487422023-09-09 07:57:11
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.
... select '#DEBUG: proc started'; ...
Kemudian tapis apabila memanggilnya daripada Bash:
output_var=$(mysql -sN test_db -e "call delete_me(@outs); select @outs" | grep -v '#DEBUG')
Idea lain ialah menukar kod supaya pernyataan nyahpepijat dikeluarkan hanya dengan syarat.
if @debug then select 'proc started'; end if;
Jadi jika anda mahukan output debug, anda boleh memanggilnya seperti ini:
output_var=$(mysql -sN test_db -e "set @debug=1; call delete_me(@outs); select @outs")
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.
P粉8185616822023-09-09 00:57:17
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:
all_output=$(mysql -sN test_db -e "call load_procedure(@out);select @out") # for demo purposes I'll use: all_output='proc started proc ended 1043'
Untuk menambah semua kecuali baris terakhir ke fail log:
$ printf "%s\n" "${all_output}" | head -n -1 >> logfile $ cat logfile proc started proc ended # sed alternative: $ printf "%s\n" "${all_output}" | sed '$d' >> logfile $ cat logfile proc started proc ended
Untuk menangkap baris terakhir ke pembolehubah baharu:
$ output_var="$(printf "%s\n" "${all_output}" | tail -1)" $ printf "%s\n" "${output_var}" 1043