Mysql

MySQL觸發器呼叫儲存過程總是為儲存過程的out參數獲取空值

  • April 13, 2020

我的儲存過程的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是使用者定義的變數。它在連接級別上定義並具有連接範圍(它是在連接內第一次訪問時創建的,它可以在過程之外訪問,即使在過程結束其工作之後,它也不會在過程呼叫之間改變它的值 - 但可能是由此連接中的其他程式碼更改)。而且它沒有明確的數據類型,它的數據類型可能會被賦值改變(而且,在大多數情況下,你無法預測它的真實數據類型)。請參閱使用者定義的變數

引用自:https://dba.stackexchange.com/questions/264869