我遇到了一种情况,我必须为我们现有的数据库创建一个过程。举个例子:
SQL数据库有名字、姓氏、dateOfBirth和id字段。Id将使用firstName、lastName和dateOfBirth的组合创建,因为它将使用户选择如下:('James','Borg','10-11-2027')->系统将显示如下选择:
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。需要助手吗?
发布于 2016-02-22 01:40:36
我没有看到任何随机化,但我可以看到一个模式。如何在变量或数组中分配这些模式,然后使用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;https://stackoverflow.com/questions/35543780
复制相似问题