Oracle 過程引數與列名衝突的bug解決

2021-06-23 00:00:22 字數 873 閱讀 5855

在嵌入式sql語句中,oracle資料庫會首先把不規範的識別符號當作表中的列名來解釋,如果不能找到匹配的列,oracle才嘗試把它當作當前作用範圍內的pl/sql變數來解釋。所以當過程引數或定義的變數與表中列名相同時,會導致sql語句限定條件的失效。

示例:刪除訂單表中指定訂單號的記錄

procedure del_order(order_id in number, p_message out varchar2) is

begin

delete orders where ordr_id = order_id;

exceptions when others then

return sqlerrm;

end del_order;

這段**的執行結果是刪除orders表中的一切內容。原因就是:sql的名稱 解析首先使用的是列名而不是pl/sql識別符號。這個where子句的的條件永遠為真。

修正方法:

1.通過包或過程名來限定

delete orders where ordr_id = del_order.order_id

2.通過引數名加字首,避免引數或變數與表中列名相同

procedure del_order(p_order_id in number, p_message out varchar2) is

begin

delete orders where ordr_id = p_order_id;

end del_order;

Oracle 儲存過程表名稱列名稱做引數

當前的系統中有幾種日誌資訊做了分表處理,每個月插入到乙個表中,乙個表的分表有12個。這樣的這種表有四個左右。有個定時器,每天晚上的時候去執行滿足條件的表去刪除日誌的資訊,可以配置儲存日誌的時間的。所以只想要通過表名稱,刪除時間資訊,列名稱。create orreplace procedure ala...

Oracle儲存過程表名稱列名稱做引數,動態SQL

當前的系統中有幾種日誌資訊做了分表處理,每個月插入到乙個表中,乙個表的分表有12個。這樣的這種表有四個左右。有個定時器,每天晚上的時候去執行滿足條件的表去刪除日誌的資訊,可以配置儲存日誌的時間的。所以只想要通過表名稱,刪除時間資訊,列名稱。create orreplace procedure ala...

oracle 儲存過程引數

oracle 儲存過程型別 1 in 輸入型別,即由應用程式將資料傳入oracle儲存過程中 這種引數在儲存過程中是唯讀引數,在儲存過程中無法對該型別的引數進行修改 2 out 輸出引數,是在儲存過程中對該值進行賦值,在程式中獲取值。3 in out 輸入輸出引數,兼具以上兩種特性,但可讀可寫。驗證...