prosedur mysql seharusnya hanya mengembalikan status kepada skrip unix
P粉924915787
P粉924915787 2023-09-08 09:44:26
0
2
600

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粉924915787
P粉924915787

membalas semua(2)
P粉203648742

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粉818561682

Andaian:

  • Pernyataan nyahpepijat dan select @out ditunjukkan pada baris berasingan (seperti dalam soalan asal OP)
  • Perlu tambah semua kecuali baris terakhir ke fail log
  • Baris terakhir akan disimpan dalam pembolehubah

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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan