我遇到过必须为现有数据库创建过程的情况。举个例子:
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。需要一些助手
答案 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;