我有一個 mysql 程序,它有 out 參數(shù)和一些用于調(diào)試的打印語句。 我從 Unix shell 腳本調(diào)用這個過程,想法是將 out 參數(shù)分配給一個 unix 變量,我用它來檢查以后的條件。但是變量正在獲取打印語句也被分配。我想擺脫打印語句,而只將輸出參數(shù)(整數(shù))分配給變量。
Unix 腳本:
output_var=`mysql -sN test_db -e "call delete_me(@outs);select @outs"` echo $output_var
也給出打印語句
proc started proc ended 1043
當(dāng)我在像 DBeaver 這樣的 SQL 客戶端中運行代碼時..我只得到輸出參數(shù)..
call delete_me(@out);select @out
@out ---- 1043
我不想禁止打印/調(diào)試語句,因為它們對我的日志很有幫助。但我不希望它們出現(xiàn)在 mysql out 變量中,最終也出現(xiàn)在我的 unix 變量中。
這是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;
由于“debug”語句輸出到stdout,并且select @out;
也輸出到stdout,因此MySQL客戶端無法區(qū)分它們。過程沒有輸出重定向功能。
所以你必須創(chuàng)造性地思考。
一個想法是確保您的調(diào)試語句具有一些通用模式,以便您可以將其過濾掉。例如,一致地使用“#DEBUG”一詞。
... select '#DEBUG: proc started'; ...
然后在從 Bash 調(diào)用它時對其進行過濾:
output_var=$(mysql -sN test_db -e "call delete_me(@outs); select @outs" | grep -v '#DEBUG')
另一個想法是更改代碼,以便調(diào)試語句僅有條件地輸出。
if @debug then select 'proc started'; end if;
因此,如果您想要調(diào)試輸出,可以這樣調(diào)用它:
output_var=$(mysql -sN test_db -e "set @debug=1; call delete_me(@outs); select @outs")
如果您不需要調(diào)試輸出,則不要設(shè)置@debug=1
。
最重要的是,MySQL 存儲過程在很多情況下確實很不方便。沒有真正的調(diào)試器,沒有包,沒有編譯器,沒有標準庫,沒有原子部署等等。我已經(jīng)使用MySQL很多年了,但我?guī)缀鯖]有見過程序的良好用途。
假設(shè):
select @out
顯示在單獨的行上(與OP的原始問題一樣)我們將從 OP 當(dāng)前捕獲所有輸出到變量的方法的副本開始:
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'
要將除最后一行之外的所有內(nèi)容追加到日志文件中:
$ 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
要將最后一行捕獲到新變量:
$ output_var="$(printf "%s\n" "${all_output}" | tail -1)" $ printf "%s\n" "${output_var}" 1043