国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

mysql 過程應(yīng)該只返回狀態(tài)給 unix 腳本
P粉924915787
P粉924915787 2023-09-08 09:44:26
0
2
778

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

P粉924915787
P粉924915787

全部回復(fù)(2)
P粉203648742

由于“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ī)缀鯖]有見過程序的良好用途。

P粉818561682

假設(shè):

  • 調(diào)試語句和select @out顯示在單獨的行上(與OP的原始問題一樣)
  • 需要將除最后一行之外的所有內(nèi)容附加到日志文件中
  • 最后一行將保存在變量中

我們將從 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
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板