搜尋

首頁  >  問答  >  主體

mysql 程序應該只會回傳狀態給 unix 腳本

我有一個 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粉924915787P粉924915787501 天前664

全部回覆(2)我來回復

  • P粉203648742

    P粉2036487422023-09-09 07:57:11

    由於「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很多年了,但我幾乎沒有見過程式的良好用途。

    回覆
    0
  • P粉818561682

    P粉8185616822023-09-09 00:57:17

    假設:

    • 偵錯語句和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

    回覆
    0
  • 取消回覆