Mysql
MySQL觸發器呼叫儲存過程總是為儲存過程的out參數獲取空值
我的儲存過程的OUT參數,總是返回一個空值。
這是範例表、觸發器和過程程式碼。
表:
test
列:
id - Int
status - enum(‘pass’, ‘fail’)
status - enum(‘pass’, ‘fail’)
(允許為空)表中的值:
id | status 1 | null
扳機:
create trigger BEFORE_UPDATE_TEST before update on `test` for each row begin call Test_BEFORE_UPDATE_TEST(old.id, @updatedStatus); ## I always get @updatedStatus null/nil if (@updatedStatus is not null and @updatedStatus <> new.status) then set new.status = @updatedStatus; end if; end;
程序:
create procedure Test_BEFORE_UPDATE_TEST ( IN id int(5), OUT status enum(‘pass’, ‘fail’) ) begin @status = ‘pass’; END;
這段程式碼有什麼問題,因為我在 value 中得到了 null 的意外結果
@updatedStatus
,應該是'pass'
.我在 dba.stackexchange 上關注 QA,但找不到解決方案。
我在 MacOS Catalina 中使用 MySQLWorkbench,MySQL 的版本是 8.0.19。
能否請您詳細說明一下。(幫助我更詳細地了解) – Krunal
create procedure Test_BEFORE_UPDATE_TEST ( IN id int(5), OUT status enum('pass', 'fail') ) begin /* wrong statement - assigns to another variable @status = 'pass'; */ status = 'pass'; END;
status
是局部變數 - 它在過程級別定義並具有過程範圍(它在過程開始時創建,在過程之外不可訪問,當過程完成其工作時它將被銷毀,如果再次呼叫該過程則新實例一個名為的變數status
將被創建)。此外,它有一個明確的數據類型,不能更改,並且在錯誤的使用/分配過程中可能會產生不匹配的數據類型錯誤。請參閱儲存程序中的變數。
@status
是使用者定義的變數。它在連接級別上定義並具有連接範圍(它是在連接內第一次訪問時創建的,它可以在過程之外訪問,即使在過程結束其工作之後,它也不會在過程呼叫之間改變它的值 - 但可能是由此連接中的其他程式碼更改)。而且它沒有明確的數據類型,它的數據類型可能會被賦值改變(而且,在大多數情況下,你無法預測它的真實數據類型)。請參閱使用者定義的變數。