设置连接字符串的上限长度

时间:2016-02-17 22:47:41

标签: database oracle plsql

编辑:由于某种原因,我在格式化这段代码时遇到了很多麻烦,请耐心等待。我也知道有些代码丢失了。这只是代码的一部分。

我正在模拟每晚运行的批量加载以进行一些负载测试。我遇到的问题是我的自动生成的PK在插入100次左右后超过了列数据长度。如何在不违反唯一约束的情况下封锁我的字符串,同时每个表插入大约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 :(得分: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的值,则ORA-06502: PL/SQL: numeric or value error异常将被提出。

答案 1 :(得分:0)

  

我建议去SEQUENCES,而不是使用随机字符串   代。通过这种方式,您将不会面临唯一的密钥违规和   您也可以将max seq limit设置为的数据类型限制   柱。希望这些信息有所帮助。