从给定的字符串中随机插入

Inserting random from a given string

我的目的是编写一个插入语句,从给定的字符串中添加一个随机值,更具体地说,如果此人已婚、单身或鳏夫。我需要先用数百个随机条目填充我的 table,因为我需要对其进行 运行 Autotrace 并检查其优化。无论如何,我首先创建了 table,然后填充了所有列,除了关于婚姻状况的列。然后我想为此编写一个不同的 INSERT 语句,因为我认为将它放入我为填充 table 所做的 plSQL 块中可能更容易。这是我的代码:

create table employees(
    id_employee integer not null,
    name varchar2(50) not null,
    surname varchar2(50) not null,
    marital_status varchar2(50),
    birthday date);

ALTER TABLE employees ADD CONSTRAINT employees_pk PRIMARY KEY ( id_employee );

declare 
  id_employee integer:= 1;
begin
  while id_employee <= 20 loop
    insert into employees values (id_employee, dbms_random.string('l', 10), dbms_random.string('l', 10), null, TO_DATE(
              TRUNC(
                   DBMS_RANDOM.VALUE(TO_CHAR(DATE '2016-01-01','J')
                                    ,TO_CHAR(DATE '2020-12-31','J')
                                    )
                    ),'J'
               ));
    id_employee:= id_employee + 1;
  end loop;
end;

现在我已经管理好它并且它起作用了,我只需要创建一个 INSERT 语句来基本上修改每个条目的 marital_status 上的 null 值柱子。但正如我之前所说,我想要一个 return 的声明(已婚、单身、鳏夫)。这可以实现吗?还是无法给出从给定字符串中提取随机值的命令?

如果我没理解错的话,您根本不需要 PL/SQL - 一切都可以在一个 insert 语句(或 select,如果您愿意)中完成。方法如下:

SQL> CREATE TABLE employees
  2  (
  3     id_employee      INTEGER PRIMARY KEY,
  4     name             VARCHAR2 (50) NOT NULL,
  5     surname          VARCHAR2 (50) NOT NULL,
  6     marital_status   VARCHAR2 (50),
  7     birthday         DATE
  8  );

Table created.

SQL> CREATE SEQUENCE seqes;

Sequence created.

插入示例行:

SQL> INSERT INTO employees (id_employee,
  2                         name,
  3                         surname,
  4                         marital_status,
  5                         birthday)
  6         SELECT seqes.NEXTVAL id_employee,
  7                DBMS_RANDOM.string ('l', 10) name,
  8                DBMS_RANDOM.string ('l', 10) surname,
  9                --
 10                CASE
 11                   WHEN MOD (seqes.NEXTVAL, 3) = 0 THEN 'single'
 12                   WHEN MOD (seqes.NEXTVAL, 2) = 0 THEN 'married'
 13                   ELSE 'widower'
 14                END marital_status,
 15                --
 16                TO_DATE (
 17                   TRUNC (
 18                      DBMS_RANDOM.VALUE (TO_CHAR (DATE '2016-01-01', 'J'),
 19                                         TO_CHAR (DATE '2020-12-31', 'J'))),
 20                   'J') birthda
 21           FROM DUAL
 22     CONNECT BY LEVEL <= 20;

20 rows created.

结果:

SQL> SELECT * FROM employees;

ID_EMPLOYEE NAME         SURNAME      MARITAL_STATUS  BIRTHDAY
----------- ------------ ------------ --------------- ----------
          1 cpewxypfop   urkqkpapdk   widower         22.12.2018
          2 qjslhprqxf   jxoaennyqe   married         27.08.2017
          3 jjwknqkcel   zkmnwtoovv   single          25.10.2018
          4 levwydigey   numbxjvjtc   married         12.02.2019
          5 hswtiotjin   cjdfiastvi   widower         30.01.2019
          6 yxahvjfmre   dnlfmkphmv   single          11.08.2017
          7 nctcntredz   raqpofzufx   widower         29.05.2018
          8 wyivovpnoc   ikjakuzanf   married         19.09.2016
          9 rvtbqfgqnu   iuqjqosait   single          28.07.2018
         10 oislloosfy   xtfxpnceik   married         30.03.2020
         11 issbxtldsn   bovdghpjke   widower         21.09.2018
         12 gzgjdlvwcw   rmfqglwohc   single          11.12.2019
         13 utbznnyyhs   ojcswdwuvh   widower         21.12.2019
         14 etsvhavose   fypgntictn   married         23.03.2018
         15 myjijmagej   lvmpbcvcfc   single          12.09.2016
         16 givwwayxkf   hgemcfvnff   married         13.02.2016
         17 nquarbpzlf   zwgjukhgxg   widower         07.09.2018
         18 lnyyrkohac   ttygaxmvle   single          25.05.2020
         19 gmqboujcbb   qszmifozcs   widower         20.09.2019
         20 eegwdvqvld   dsembshumq   married         04.09.2020

20 rows selected.

SQL>