我有一個 mysql 程序,它有 out 參數和一些用於偵錯的列印語句。 我從 Unix shell 腳本呼叫這個過程,想法是將 out 參數分配給一個 unix 變量,我用它來檢查以後的條件。但是變數正在取得列印語句也被指派。我想擺脫列印語句,而只將輸出參數(整數)分配給變數。
Unix 腳本:
output_var=`mysql -sN test_db -e "call delete_me(@outs);select @outs"` echo $output_var
也給出列印語句
proc started proc ended 1043
當我在像 DBeaver 這樣的 SQL 客戶端中執行程式碼時..我只得到輸出參數..
call delete_me(@out);select @out
@out ---- 1043
我不想禁止列印/偵錯語句,因為它們對我的日誌很有幫助。但我不希望它們出現在 mysql out 變數中,最終也出現在我的 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客戶端無法區分它們。過程沒有輸出重定向功能。所以你必須創造性地思考。
一個想法是確保您的偵錯語句具有一些通用模式,以便您可以將其過濾掉。例如,一致地使用“#DEBUG”一詞。
然後在從 Bash 呼叫它時對其進行過濾:
另一個想法是更改程式碼,以便偵錯語句僅有條件地輸出。
因此,如果您想要偵錯輸出,可以這樣呼叫它:
如果您不需要偵錯輸出,則不要設定
@debug=1
。最重要的是,MySQL 預存程序在許多情況下確實很不方便。沒有真正的調試器,沒有包,沒有編譯器,沒有標準庫,沒有原子部署等等。我已經使用MySQL很多年了,但我幾乎沒有見過程式的良好用途。
假設:
select @out
顯示在單獨的行上(與OP的原始問題一樣)我們將從 OP 目前捕獲所有輸出到變數的方法的副本開始:
要將除最後一行之外的所有內容追加到日誌檔案中:
要將最後一行捕捉到新變數: