主頁 > .NET開發 > OraclePL/SQL-包常量定義為(隱式)不為空

OraclePL/SQL-包常量定義為(隱式)不為空

2022-01-12 01:46:07 .NET開發

如果 Oracle 包/程序/函式中的常量被定義為(隱式),是否有任何正面或負面(性能)影響not null例如

// Varchar2
C_LF_V1 constant varchar2(1)          := chr(10);
C_LF_V2 constant varchar2(1) not null := chr(10);
// PLS number
C_MAX_PLS_STR_LENB_V1 constant pls_integer          := 32767;
C_MAX_PLS_STR_LENB_V2 constant pls_integer not null := 32767;
C_MAX_PLS_STR_LENB_V3 constant positiven            := 32767;
C_MAX_PLS_STR_LENB_V4 constant simple_integer       := 32767;
// Date
C_MAX_DATE_V1 constant date          := date '9999-12-31'
C_MAX_DATE_V2 constant date not null := date '9999-12-31'
// ...

該檔案根本不針對這些細節,因為(不幸的是)太頻繁了 - 從 11 到 19 進行了檢查(如果它實際上是特定于版本的,那么從 19 開始的實作會很有趣)。

當然,運行一些測驗是可能的/容易的,但這只會提供平臺/版本/機器特定的結果,而低級實作/概念邏輯更有趣,即

  • 將(隱式)not null編譯為已知的非NULL,還是會導致每次訪問都進行NULL檢查?

更新(澄清)

  • 我的問題與已知的常量有關NOT NULL(因此與NULL處理無關
  • 我根本不在“想要的”納秒調整之后——我想知道幕后實際發生了什么;例如,simple_integer檔案說它可以使繁重的計算更有效,這意味著在編譯時它“知道”這樣的變數永遠不可能NULL-> 那么這個含義是否也適用于例如date定義為NOT NULL- 或者更棘手的varchar2NOT NULL允許定義子型別,但由于忽略可空屬性而沒有意義)

uj5u.com熱心網友回復:

我不知道。

只是大聲思考。

這編譯:

SQL> create or replace package pkg_test as
  2    c_v1 constant varchar2(1) := null;
  3  end;
  4  /

Package created.

指定常量NOT NULL并分配NULL給它不起作用:

SQL> create or replace package pkg_test as
  2    c_v1 constant varchar2(1) not null := null;
  3  end;
  4  /

Warning: Package created with compilation errors.

SQL> show err
Errors for PACKAGE PKG_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/8      PL/SQL: Declaration ignored
2/41     PLS-00382: expression is of wrong type

盡管空字串被視為NULLs,但這不會引發任何錯誤:

SQL> create or replace package pkg_test as
  2    c_v1 constant varchar2(1) not null := '';
  3  end;
  4  /

Package created.

SQL>

是否有意義?一個常數,其值為NULL? 也許,也許不是,我不記得我用過它。


作為一個包體:讓我們重用最后的代碼并添加一個程序:

SQL> create or replace package pkg_test as
  2    c_v1 constant varchar2(1) not null := '';
  3
  4    procedure p_test;
  5  end;
  6  /

Package created.

SQL> create or replace package body pkg_test is
  2    procedure p_test is
  3    begin
  4      c_v1 := 'x';
  5    end;
  6  end;
  7  /

Warning: Package Body created with compilation errors.

SQL> show err
Errors for PACKAGE BODY PKG_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/5      PL/SQL: Statement ignored
4/5      PLS-00363: expression 'C_V1' cannot be used as an assignment
         target

SQL>

對; 它甚至沒有意義——它是一個常量,你不應該修改它的值。


檔案說:

  • “宣告變數”中的資訊也適用于常量宣告,但常量宣告還有兩個要求:關鍵字 CONSTANT 和常量的初始值。
  • (...)
  • 在變數宣告中,初始值是可選的,除非您指定 NOT NULL 約束。在常量宣告中,初始值是必需的。

It looks like Oracle treats variable and constant declarations almost the same, with some differences. As if constants "inherited" NOT NULL constraint from variables. Does it make sense? Can't tell.

More from the same document:

  • If the declaration is in a package specification, the initial value is assigned to the variable or constant for each session (whether the variable or constant is public or private).

So: it is assigned once for the session. It is a constant, after all ...


因此,從我的角度來看,我不希望對是否對NOT NULL常量施加約束會產生任何性能影響我想說還有其他需要擔心的事情,例如在包體內調整查詢;如果寫得不好它們將對性能產生重大影響。常數是NULLNOT NULL將是你最不擔心的。

uj5u.com熱心網友回復:

可以使用一些小的編譯時優化,但它們不太可能有任何顯著的好處,例如,如果你做類似的事情

create or replace 
package PKG is
  x constant int  not null := 0;
  procedure p;
end;
/

create or replace 
package body PKG is

 procedure p is
   y int;
 begin
 for i in 1 .. 1000000
 loop
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
   if x is not null then
      y := i;   
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
   end if;
end loop;
end;
end;
/

set timing on
exec pkg.p;

您會看到在常量定義中洗掉 CONSTANT 會產生更快的結果,但我們仍在談論每次呼叫的微/納秒收益。同樣,如果它不是常量但具有 NOT NULL,您將獲得相同的好處。

此類宣告的主要目的只是另一種形式的代碼和資料正確性,而不是性能。

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/408374.html

標籤:

上一篇:即使滿足條件,存盤程序也不更新列

下一篇:只要任務未完成且專案未積壓,就向任務所有者發送電子郵件

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more