mysql 程序應該只會回傳狀態給 unix 腳本
P粉924915787
P粉924915787 2023-09-08 09:44:26
0
2
625

我有一個 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;

P粉924915787
P粉924915787

全部回覆(2)
P粉203648742

由於「debug」語句輸出到stdout,而select @out;也輸出到stdout,因此MySQL客戶端無法區分它們。過程沒有輸出重定向功能。

所以你必須創造性地思考。

一個想法是確保您的偵錯語句具有一些通用模式,以便您可以將其過濾掉。例如,一致地使用“#DEBUG”一詞。

...
select '#DEBUG: proc started';
...

然後在從 Bash 呼叫它時對其進行過濾:

output_var=$(mysql -sN test_db 
  -e "call delete_me(@outs); select @outs" 
  | grep -v '#DEBUG')

另一個想法是更改程式碼,以便偵錯語句僅有條件地輸出。

if @debug then
  select 'proc started';
end if;

因此,如果您想要偵錯輸出,可以這樣呼叫它:

output_var=$(mysql -sN test_db 
  -e "set @debug=1; call delete_me(@outs); select @outs")

如果您不需要偵錯輸出,則不要設定@debug=1

最重要的是,MySQL 預存程序在許多情況下確實很不方便。沒有真正的調試器,沒有包,沒有編譯器,沒有標準庫,沒有原子部署等等。我已經使用MySQL很多年了,但我幾乎沒有見過程式的良好用途。

P粉818561682

假設:

  • 偵錯語句和select @out顯示在單獨的行上(與OP的原始問題一樣)
  • 需要將除最後一行之外的所有內容附加到日誌檔案中
  • 最後一行將保存在變數中

我們將從 OP 目前捕獲所有輸出到變數的方法的副本開始:

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'

要將除最後一行之外的所有內容追加到日誌檔案中:

$ 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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板