Заполнение таблицы в диапазоне между «L00000000» и «L00000010» в оракуле - PullRequest
1 голос
/ 11 октября 2019

Мне нужна помощь. Однажды мне помогли с кодом для заполнения таблицы в диапазоне между первым и последним значениями. Этот код работает нормально, но есть одна проблема, которую я не могу понять.

Когда я использую в качестве конечных чисел, таких как P1_FIRST = L4819222 и P1_LAST = L4819225, все работает нормально. Но когда я использую экстремальные ознобы как L00000000 и L00000010, я получаю: L1, L2, L3 ... но я хотел увидеть: `L00000000, L00000001, L00000002 и т. Д.

Можете ли вы помочь мне вэто?

INSERT INTO test2 (val)
SELECT    SUBSTR (:P1_FIRST, 1, 1)
      || TO_CHAR (
            (  TO_NUMBER (REGEXP_SUBSTR (:P1_FIRST, '\d+$'))
             + LEVEL
             - 1))
         AS val
 FROM dual
 CONNECT BY LEVEL <=
                TO_NUMBER (
                   REGEXP_SUBSTR (:P1_LAST, '\d+$'))
             - TO_NUMBER (
                   REGEXP_SUBSTR 

Ответы [ 2 ]

3 голосов
/ 11 октября 2019
SQL> select 'L' || lpad(level - 1, 8, '0') val
  2  from dual
  3  connect by level <= 11;

VAL
---------
L00000000
L00000001
L00000002
L00000003
L00000004
L00000005
L00000006
L00000007
L00000008
L00000009
L00000010

11 rows selected.

SQL>

Для элементов INSERT и Apex:

SQL> create table test (val varchar2(20));

Table created.

SQL> insert into test (val)
  2  with subs as
  3    (select to_number(regexp_substr('&P1_LAST' , '\d+$')) clast,
  4            to_number(regexp_substr('&P1_FIRST', '\d+$')) cfirst
  5     from dual
  6    )
  7  select 'L' || lpad(cfirst + level - 1, 8, '0') val
  8  from subs
  9  connect by level <= clast - cfirst + 1;
Enter value for p1_last: L4819225
Enter value for p1_first: L4819222

4 rows created.

SQL> /
Enter value for p1_last: L0000010
Enter value for p1_first: L0000000

11 rows created.

Результат:

SQL> select * From test order by val;

VAL
--------------------
L00000000
L00000001
L00000002
L00000003
L00000004
L00000005
L00000006
L00000007
L00000008
L00000009
L00000010
L04819222
L04819223
L04819224
L04819225

15 rows selected.

SQL>

Запрос, который вы будете использовать в Apex, равен

insert into test (val)
with subs as
  (select to_number(regexp_substr(:P1_LAST , '\d+$')) clast,
          to_number(regexp_substr(:P1_FIRST, '\d+$')) cfirst
   from dual
  )          
select 'L' || lpad(cfirst + level - 1, 8, '0') val
from subs
connect by level <= clast - cfirst + 1;
1 голос
/ 11 октября 2019

Вам нужно использовать LPAD. Попробуйте:

SELECT SUBSTR (:P1_FIRST, 1, 1)
      ||
 LPAD(TO_CHAR (  TO_NUMBER (REGEXP_SUBSTR (:P1_FIRST, '\d+$')) + level), 8,'0') AS val 
FROM dual
connect by level < 10:

в вашем случае:

SELECT SUBSTR ('L00000000', 1, 1) || lpad(TO_CHAR (  TO_NUMBER (REGEXP_SUBSTR ('L00000000', '\d+$' )) + LEVEL - 1), 8, '0') AS val 
FROM dual 
CONNECT BY LEVEL <= TO_NUMBER ( REGEXP_SUBSTR ('L00000010', '\d+$')) - TO_NUMBER ( REGEXP_SUBSTR ('L00000000', '\d+$')) + 1
...