ORACLE 自動成長通過封裝函數,方便調用

來源:互聯網
上載者:User

標籤:

  好的編程習慣,是一個很有必要的過程。好的編程習慣,可以因人而異,但是簡單地、基本地代碼層級的就那些:寫注釋、合理的縮排、換行、變數命名等。

  對我們程式員來說,大部分時間都對著電腦,在對著電腦的大部分時間都在對著代碼,要麼是看別人代碼,要麼是在寫代碼。在看別人的代碼的過程中,當看到別人 的代碼很亂的時候,心裡肯定會說,這他媽的誰寫的代碼,看起來真費勁,要注釋沒注釋,該換行的時候沒換行,縮排也沒規則。所以,好的編程習慣,一個好處就是,方便自己,也方便別人看自己的代碼。編程的時候很多情況是由於一些細節沒有注意。在自己代碼走讀的過程成中會出現對應錯誤,良好的代碼習慣,也有利於問題代碼能快速的定位。好的編程習慣,好處就是,可以避免一些問題的發生,從而提高工作效率。

  一般情況下我們的ORACLE 使用關鍵字上要使用大寫的,這樣有利於 編程規範,所以這邊提供一個小技巧:

  在PL/SQL Tool -> Preferences 中的:

  

Oracle 資料庫中,建立一個表的過程,並且其中主鍵是自動成長的,因為ORACLE 不提供自動成長的自主id,所以,需要我們自己先建立序列然後在調用序列的方法實現自動成長一般過程如下:

-- Create tableCREATE TABLE T_Test(        test_id INTEGER CONSTRAINT t_test_pk PRIMARY KEY,        name VARCHAR2(10) NOT NULL);      -- Add comments to the tableCOMMENT ON TABLE T_Test  is ‘測試表‘;-- Add comments to the columnsCOMMENT ON COLUMN  T_Test.test_id  is ‘自增主鍵‘;COMMENT ON COLUMN  T_Test.name  is ‘名稱‘;-- Create/SequencesCREATE SEQUENCE SEQ_T_Test MINVALUE 1 MAXVALUE 1E27 START WITH 1 INCREMENT BY 1 NOCACHE CYCLE;--insertINSERT INTO t_test(test_id,NAME)VALUES(seq_t_test.nextval,‘linkepeng‘);

每次我這樣插入資料的時候,如果開始的時候,沒有建立對應的序列的化,我們還要先建立,而且,有可能命名衝突,等一些情況,感覺使用起來不方便

這邊我寫個函數,是為瞭解決,自動建立的函數這樣調用者,不用去關心,序列是否已經建立,而且只要每次調用傳入對應的表名字,這樣就能擷取對應的增長的ID。

第一步:/*   描述:取字串左邊幾個字元   linkepeng   日期:2016-08-07*/CREATE OR REPLACE FUNCTION LeftStr(       M_Text VARCHAR2,       M_Count INTEGER)RETURN VARCHARAS       L_Result VARCHAR(4000);BEGIN       L_Result:=‘‘;       IF M_Text IS NOT NULL THEN         L_Result:=Substr(M_Text,1,M_Count);       END IF;       RETURN L_Result;END;/*   描述:建立序列對象   linkepeng   日期:2016-08-07*/CREATE OR REPLACE PROCEDURE CreateSequence(       M_TableName IN VARCHAR2 --表名或序列對象名稱)--這個在普通使用者情況下,需要添加這條語句。AUTHID CURRENT_USERAS  L_UserName         VARCHAR2(30);  L_SqlString        VARCHAR2(1000);  L_SequenceName_C   VARCHAR2(500);  L_RowCount         INTEGER;  L_MAXID            NUMBER;  L_Key_FieldName    VARCHAR2(50);BEGIN   --根據表名得到序列名稱  L_SequenceName_C := REPLACE(M_TableName,‘-‘,‘_‘);  IF UPPER(LeftStr(L_SequenceName_C,4))<>‘SEQ_‘ THEN    L_SequenceName_C := ‘SEQ_‘ || L_SequenceName_C;  END IF;  L_SequenceName_C := UPPER(LeftStr(L_SequenceName_C,30));   --根據表名取出主鍵欄位  BEGIN    SELECT COLUMN_NAME INTO L_Key_FieldName    FROM User_Cons_Columns    WHERE CONSTRAINT_NAME IN (          SELECT CONSTRAINT_NAME          FROM User_Constraints          WHERE CONSTRAINT_TYPE = ‘P‘ AND UPPER(TABLE_NAME)=UPPER(M_TableName)    ) AND ROWNUM=1;    --根據表名、主鍵欄位取出最大值    L_SqlString := ‘SELECT MAX(‘ || L_Key_FieldName || ‘) FROM ‘ || M_TableName;    BEGIN      EXECUTE IMMEDIATE L_SqlString INTO L_MAXID;    EXCEPTION       --捕捉錯誤      WHEN OTHERS THEN        L_MAXID:=0;    END;  EXCEPTION    WHEN OTHERS THEN      L_MAXID:=0;  END;  L_MAXID := NVL(L_MAXID, 0);  --修改下一個值  L_MAXID := L_MAXID + 1;  L_SqlString := ‘CREATE SEQUENCE ‘ || L_SequenceName_C;  L_SqlString:=L_SqlString ||‘ MINVALUE 1 MAXVALUE 1E27 START WITH ‘||to_char(L_MAXID) || ‘ INCREMENT BY 1 NOCACHE CYCLE‘;  PRAGMA AUTONOMOUS_TRANSACTION;  EXECUTE IMMEDIATE L_SqlString;END;/*   描述:擷取某個表主鍵新ID   linkepeng   日期:2016-08-07*/CREATE OR REPLACE FUNCTION GetNewID(       M_TableName       IN VARCHAR2)RETURN INTEGERAUTHID CURRENT_USERAS       L_StrSql VARCHAR2(1000);       L_NewID INTEGER;       L_RowCount INTEGER;       L_SequenceName_T VARCHAR2(255);BEGIN       L_SequenceName_T :=LeftStr(‘Seq_‘||REPLACE(M_TableName,‘-‘,‘_‘),30);        --判斷序列是否存在       SELECT COUNT(*) INTO L_RowCount FROM User_Objects       WHERE Object_Type = ‘SEQUENCE‘ AND Upper(OBJECT_NAME) = Upper(L_SequenceName_T);       IF L_RowCount=0 THEN         --通過預存程序建立序列         CreateSequence(M_TableName);       END IF;       L_StrSql:=‘SELECT ‘||L_SequenceName_T||‘.Nextval FROM dual‘;       EXECUTE IMMEDIATE L_StrSql INTO L_NewID;       RETURN L_NewID;END;

其中 AUTHID CURRENT_USER 為的防止使用者出現: EXECUTE IMMEDIATE 如果在執行DDL的時候,如果在預存程序沒有這個的化,會出現許可權不足的問題。

還有一種解決方案是:給使用者提高許可權:在sysdba許可權 使用者下,提高許可權命令:       GRANT CREATE ANY TABLE TO ‘使用者名稱‘;

這樣建立以後,我們就可以這樣調用我們的插入語句了:

  INSERT INTO t_test(test_id,NAME)VALUES(getnewid(‘t_test‘),‘linkepeng‘);

在寫代碼的時候,可能出現的序列未建立的異常就可以很好的避免了。

 

 

ORACLE 自動成長通過封裝函數,方便調用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.