Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres-如何创建字母数字序列,如AA0000等_Sql_Perl_Postgresql 9.4 - Fatal编程技术网

Sql Postgres-如何创建字母数字序列,如AA0000等

Sql Postgres-如何创建字母数字序列,如AA0000等,sql,perl,postgresql-9.4,Sql,Perl,Postgresql 9.4,我想创建一个字母数字序列,如下所示: AAAA0000 AAAA0001 AAAA0002 AAAA0003 . . . AAAA9999 AAAB0000 AAAB0001 等等 我创建了此存储过程来执行此操作,但速度太慢: CREATE OR REPLACE FUNCTION public.fn_batch_seq() RETURNS text LANGUAGE plpgsql AS $body$ DECLARE v_sequence TEXT := ''; v_next_

我想创建一个字母数字序列,如下所示:

AAAA0000
AAAA0001
AAAA0002
AAAA0003
.
.
.
AAAA9999
AAAB0000
AAAB0001
等等

我创建了此存储过程来执行此操作,但速度太慢:

CREATE OR REPLACE FUNCTION public.fn_batch_seq()
  RETURNS text
  LANGUAGE plpgsql
AS
$body$
DECLARE
  v_sequence TEXT := '';
  v_next_sequence TEXT := '';
  v_existing_id BIGINT := 0;
BEGIN

  /*
  *  VARCHAR BATCH SEQUENCE FOR SIMCARDS
  */
  SELECT "sequence" FROM batch_sequence WHERE id = 1 INTO v_sequence;
  IF v_sequence = '' THEN
    RAISE NOTICE 'Error - No existe ningun registro en batch_sequence almacenado';
    RETURN -500;
  END IF;
  SELECT perl_increment(v_sequence) INTO v_next_sequence;

  IF v_next_sequence = '' THEN
    RAISE NOTICE 'Error - La siguiente secuencia generada devolvio null o vacio';
    RETURN -500;
  END IF;


  UPDATE batch_sequence SET "sequence" = v_next_sequence WHERE id = 1;
  RETURN v_next_sequence;

  EXCEPTION WHEN OTHERS THEN
  /*
  * Other errors
  */
  RAISE NOTICE 'Error General - Posibles causas: No existe la tabla batch_sequence o no existe ningun registro en la misma';
  RETURN -500;

END;
$body$
  VOLATILE
  COST 100;
此过程使用表格存储序列:

CREATE TABLE batch_sequence
(
   id        serial   NOT NULL,
   sequence  text     DEFAULT 'AAAA0000'::text NOT NULL
);

-- Column id is associated with sequence public.batch_sequence_id_seq

ALTER TABLE batch_sequence
   ADD CONSTRAINT batch_sequence_pk
   PRIMARY KEY (id);
对于增量序列,我使用perl过程:

CREATE OR REPLACE FUNCTION public.perl_increment(text)
  RETURNS text
  LANGUAGE plperl
AS
$body$
my ($x) = @_;
    if (not defined $x) {
        return undef;
    }
    ++$x;
$body$
  VOLATILE
  COST 100;
它处理大量数据的速度非常慢,因为它必须在插入每一行之前执行。有没有其他方法可以使用Perl或不使用Perl

请帮忙

它处理大量数据的速度非常慢,因为它必须在插入每一行之前执行。有没有其他方法可以使用Perl或不使用Perl

第一个选项:

创建一个序列并对其进行解码:

CREATE SEQUENCE my_serial START 11110000;
翻译成字母左部分:

select nextval(''my_serial'') INTO v_nextSeq ;
select translate(
       left( trim(to_char(v_nextSeq,'9999')), 4),
       '12345','ABCDE')
       ||
       right( trim(to_char(v_nextSeq,'9999')), 4);
第二选项:

您可以保留所有序列号,然后使用它:

**将
used
字段添加到架构中,记住在序列**上创建索引:

CREATE TABLE batch_sequence
(
   id        serial   NOT NULL,
   sequence  text     DEFAULT 'AAA'::text NOT NULL,
   used      boolean  default false
);
填充整个表格,此处仅简化为两位数字

with s as (
  SELECT A.a || B.b  as sequence
  FROM unnest(string_to_array('A B C',' ')) A
  CROSS JOIN unnest(string_to_array('0 1 2 3 4 5 6 7 8 9',' ')) B
) 
insert into batch_sequence ( sequence )
select s.sequence
from s;
select * from batch_sequence
| id | sequence |  used |
|----|----------|-------|
| 28 |       A0 | false |
| 29 |       A1 | false |
| 30 |       A2 | false |
| 31 |       A3 | false |
| 32 |       A4 | false |
| 33 |       A5 | false |
| 34 |       A6 | false |
| 35 |       A7 | false |
| 36 |       A8 | false |
| 37 |       A9 | false |
| 38 |       B0 | false |
| 39 |       B1 | false |
| 40 |       B2 | false |
| 41 |       B3 | false |
| 42 |       B4 | false |
| 43 |       B5 | false |
| 44 |       B6 | false |
| 45 |       B7 | false |
| 46 |       B8 | false |
| 47 |       B9 | false |
| 48 |       C0 | false |
| 49 |       C1 | false |
| 50 |       C2 | false |
| 51 |       C3 | false |
| 52 |       C4 | false |
| 53 |       C5 | false |
| 54 |       C6 | false |
| 55 |       C7 | false |
| 56 |       C8 | false |
| 57 |       C9 | false |

with s as (
  SELECT A.a || B.b  as sequence
  FROM unnest(string_to_array('A B C',' ')) A
  CROSS JOIN unnest(string_to_array('0 1 2 3 4 5 6 7 8 9',' ')) B
) 
insert into batch_sequence ( sequence )
select s.sequence
from s;
select * from batch_sequence
| id | sequence |  used |
|----|----------|-------|
| 28 |       A0 | false |
| 29 |       A1 | false |
| 30 |       A2 | false |
| 31 |       A3 | false |
| 32 |       A4 | false |
| 33 |       A5 | false |
| 34 |       A6 | false |
| 35 |       A7 | false |
| 36 |       A8 | false |
| 37 |       A9 | false |
| 38 |       B0 | false |
| 39 |       B1 | false |
| 40 |       B2 | false |
| 41 |       B3 | false |
| 42 |       B4 | false |
| 43 |       B5 | false |
| 44 |       B6 | false |
| 45 |       B7 | false |
| 46 |       B8 | false |
| 47 |       B9 | false |
| 48 |       C0 | false |
| 49 |       C1 | false |
| 50 |       C2 | false |
| 51 |       C3 | false |
| 52 |       C4 | false |
| 53 |       C5 | false |
| 54 |       C6 | false |
| 55 |       C7 | false |
| 56 |       C8 | false |
| 57 |       C9 | false |

with s as (
  SELECT A.a || B.b  as sequence
  FROM unnest(string_to_array('A B C',' ')) A
  CROSS JOIN unnest(string_to_array('0 1 2 3 4 5 6 7 8 9',' ')) B
) 
insert into batch_sequence ( sequence )
select s.sequence
from s;
select * from batch_sequence
| id | sequence |  used |
|----|----------|-------|
| 28 |       A0 | false |
| 29 |       A1 | false |
| 30 |       A2 | false |
| 31 |       A3 | false |
| 32 |       A4 | false |
| 33 |       A5 | false |
| 34 |       A6 | false |
| 35 |       A7 | false |
| 36 |       A8 | false |
| 37 |       A9 | false |
| 38 |       B0 | false |
| 39 |       B1 | false |
| 40 |       B2 | false |
| 41 |       B3 | false |
| 42 |       B4 | false |
| 43 |       B5 | false |
| 44 |       B6 | false |
| 45 |       B7 | false |
| 46 |       B8 | false |
| 47 |       B9 | false |
| 48 |       C0 | false |
| 49 |       C1 | false |
| 50 |       C2 | false |
| 51 |       C3 | false |
| 52 |       C4 | false |
| 53 |       C5 | false |
| 54 |       C6 | false |
| 55 |       C7 | false |
| 56 |       C8 | false |
| 57 |       C9 | false |

创建一个函数来获取新的序列号,并将其设置为
used

,只需使用常规序列即可。创建一个函数,该函数获取其底层序列
nextval
,然后将整数值转换为字母数字值。您所说的转换是什么意思?我该怎么做你有原始序列号121431。当原始数字大于或等于1000时,保持将该数字除以1000并增加左半部分(“AAAA”)。在结束时,使用零左填充将左部分(“ABCD”)与余数连接起来。