如何循环不同的类型变量,随机化并连接它们?

时间:2016-02-22 00:05:18

标签: sql plsql

我遇到过必须为现有数据库创建过程的情况。举个例子:

SQL数据库有firstname,lastname和dateOfBirth以及id字段。 ID将使用firstName,lastName和dateOfBirth的组合创建,因为它将为用户提供以下选项:(' James',' Borg',' 10-11-2027& #39;) - >系统将显示如下选项:

james_borg
james_12
james_borg_12
borg_12
borg_james
borg_james_12

到目前为止,我没有循环这样做。但我不知道如何处理

CREATE OR REPLACE PROCEDURE GEN_LOGIN_ID
  (O_FNAME IN EMPLOYEE.FNAME%TYPE, 
   O_LNAME IN EMPLOYEE.LNAME%TYPE, 
   O_BDATE IN     EMPLOYEE.BDATE%TYPE)

IS
N_NUM NUMBER(20);
N_ID VARCHAR2(60); 
BEGIN

N_NUM:=(MONTHS_BETWEEN(SYSDATE, O_BDATE))/12;
N_ID:=CONCAT(O_FNAME,O_LNAME);
N_ID:=CONCAT(N_ID,N_NUM);
INSERT INTO POSSIBLE_IDS(ID) VALUES(N_ID);

COMMIT;


END;

如果我现在调用该程序,它会给出

 DECLARE
O_FNAME EMPLOYEE.FNAME%TYPE;
O_LNAME EMPLOYEE.LNAME%TYPE;
O_BDATE  EMPLOYEE.BDATE%TYPE;
BEGIN
GEN_LOGIN_ID('James','Borg','10-11-2027');

END;

结果来自JamesBorg-12。需要一些助手

1 个答案:

答案 0 :(得分:0)

我没有看到任何随机化,但我可以看到一个模式。如何在变量或数组中分配这些模式然后使用forall在表中插入这些值?这是您的代码的另一个版本:

  CREATE OR REPLACE PROCEDURE GEN_LOGIN_ID
    (O_FNAME IN EMPLOYEE.FNAME%TYPE, 
     O_LNAME IN EMPLOYEE.LNAME%TYPE, 
     O_BDATE IN     EMPLOYEE.BDATE%TYPE)

  IS
     N_NUM NUMBER(20);
     N_ID VARCHAR2(60); 
     type myarray  is table of varchar2(250) index by pls_integer;
     arrayofnames myarray;
  BEGIN
     N_NUM:=(MONTHS_BETWEEN(SYSDATE, O_BDATE))/12;

     arrayofnames(1):= O_FNAME || '_' || O_LNAME;
     arrayofnames(2):= arrayofnames(1) || '_' || N_NUM;
     arrayofnames(3):= O_FNAME || '_' || N_NUM;

     arrayofnames(4):= O_LNAME || '_' || O_FNAME;
     arrayofnames(5):= arrayofnames(4) || '_' || N_NUM;
     arrayofnames(6):= O_LNAME || '_' || N_NUM;
     FORALL A IN 1..arrayofnames.count
        INSERT INTO POSSIBLE_IDS(ID) VALUES(arrayofnames(a));
     COMMIT;
  END;