2016-02-17 91 views
-1

編輯:我有很多格式化此代碼出於某種原因的麻煩請耐心與我。另外我知道一些代碼丟失。這只是代碼的一部分。連續字符串設置帽長度

我正在模擬每晚運行的批處理負載,以執行一些負載測試。我面臨的問題是,在插入100個左右的數據後,我的自動生成的PK超過列數據長度。如何在不違反獨特約束條件的情況下封閉我的字符串,同時爲每張表格插入大約20,000行。我的目標是擺脫由於需求變化而產生的隨機字符串。以下是我遇到的一部分代碼。

declare 
    l_cnt integer := 0; 
    t_cnt integer := 0; 
    c_cnt integer := 0; 
    f_cnt integer := 0; 
    i  integer := 0; 

    TYPE T_EMPL_NO IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER; 
    TAB_EMPL_NO T_EMPL_NO; 
    TAB_SEC_PK T_EMPL_NO; 
    TAB_THR_PK T_EMPL_NO; 
    TAB_FTH_PK T_EMPL_NO; 
begin 
    dbms_output.put_line('START LOAD TEST'); 

    LOOP 
    i := i + 1; 
    TAB_EMPL_NO(l_cnt) := 'JB'||i; 
    TAB_SEC_PK(t_cnt) := dbms_random.string('L',6); 
    TAB_THR_PK(c_cnt) := dbms_random.string('L',1); 
    TAB_FTH_PK(f_cnt) := dbms_random.string('L',20); 

    Insert into AOMS.PARTS_MONTH_CLOSE(
     NAMES OF COLUMNS HERE 
    ) Values (
     TAB_EMPL_NO(l_cnt), 
     TAB_SEC_PK(t_cnt), 
     TAB_THR_PK(c_cnt), 
     TAB_FTH_PK(f_cnt) 
    ); 

    l_cnt := l_cnt + SQL%ROWCOUNT; 

    EXIT WHEN l_cnt = 100; -- change to record count 22k 
    END LOOP; 
    dbms_output.put_line('P2ACCTMO :Rows inserted: ' || l_cnt); 
END; 
/

作爲獎勵,如果我想的腳本來運行一個小時,但不超過一個循環我該怎麼做時插入記錄的金額是多少?非常感謝您的幫助。

+2

這是一種很難回答的問題,因爲我們不知道你的表是什麼樣子,也不知道它裏面有什麼數據,也沒有什麼主鍵值,也不知道當你的插入開始失敗時產生什麼錯誤,並且你發佈的代碼被大量編輯以至於很難說出它可能會做什麼。請編輯您的問題並添加一些額外的解釋性信息。謝謝。 –

+0

我明白了。那麼怎麼樣呢。我可以如何設置一個變量如'x'不大於1000? – Jules

+0

您的代碼似乎並未連接任何字符串(在編輯之前或之後),因此我無法查看問題所在。它似乎也等同於一個簡單的分層查詢:'INSERT INTO AOMS.PARTS_MONTH_CLOSE SELECT'JB'|| LEVEL,dbms_random.string('L',6),dbms_random.string('L',1),dbms_random.string('L',20),... FROM DUAL CONNECT BY LEVEL <= 100;' – MT0

回答

0

要定義一個給定範圍的數字數據類型(假設爲1到1000,爲了參數),您可以使用user-defined PL/SQL subtype。要做到這一點,你會使用類似

SUBTYPE MY_ZERO_TO_1K_SUBTYPE IS NUMBER(4,0) RANGE 0..1000; 

,然後定義該亞型的變量,就像任何其他變量:

nLimited_number MY_ZERO_TO1K_SUBTYPE; 

可以將此類型的變量設置爲0,1 ,2,...,998,999,1000.但是,如果將其設置爲負值或大於1000,則會引發異常。

0

我會建議去SEQUENCES而不是使用隨機字符串 一代。通過這種方式,您將不會遇到唯一的密鑰違規,並且您還可以將最大seq限制設置爲 列的數據類型限制。希望這些信息有幫助。