標籤:
好的編程習慣,是一個很有必要的過程。好的編程習慣,可以因人而異,但是簡單地、基本地代碼層級的就那些:寫注釋、合理的縮排、換行、變數命名等。
對我們程式員來說,大部分時間都對著電腦,在對著電腦的大部分時間都在對著代碼,要麼是看別人代碼,要麼是在寫代碼。在看別人的代碼的過程中,當看到別人 的代碼很亂的時候,心裡肯定會說,這他媽的誰寫的代碼,看起來真費勁,要注釋沒注釋,該換行的時候沒換行,縮排也沒規則。所以,好的編程習慣,一個好處就是,方便自己,也方便別人看自己的代碼。編程的時候很多情況是由於一些細節沒有注意。在自己代碼走讀的過程成中會出現對應錯誤,良好的代碼習慣,也有利於問題代碼能快速的定位。好的編程習慣,好處就是,可以避免一些問題的發生,從而提高工作效率。
一般情況下我們的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 自動成長通過封裝函數,方便調用