我有一个问题,我已经花了大约3天的时间。
我有一个包含6列的表(CDKEY):CDKEYSEQ,Userseq,Banned,Communityseq,cdkey,Email。
禁止始终为0(此时),Userseq为NULL,除非登录/注册cdkey和email的人在注册cdkey之前为NULL。
基本上,在用户登录之前,Userseq不会被填写。因此,在用户序列值之前总会有一个电子邮件值。
现在问题:
我试图创建一个存储过程,当有人想要一个cdkey(他们提供电子邮件)时,它会被调用。
该过程首先检查一个名为community的表,以确保社区存在。
然后,如果社区存在该过程应该检查CDKEY表中具有正确社区序列的密钥,并且对于USERSEQ和EMAIL,AlSO都具有NULL值。
显然只使用select查询不起作用,因为返回的多行符合这些条件。
我尝试使用游标,这让我更进一步。 游标的问题是,当我在WHERE子句之后有两个条件时,它没有返回任何内容。
这是我目前的程序代码:
create or replace PROCEDURE KEYREGISTRATION(
PRODUCT_IN IN VARCHAR2 ,
in_CPUID IN LONG ,
in_MACID IN LONG ,
in_MACID2 IN LONG ,
in_HDID IN LONG ,
in_PCCores IN LONG ,
in_PCName IN VARCHAR2 ,
in_Email IN VARCHAR2 ,
out_cdkey OUT VARCHAR2 ,
returncode OUT NUMBER )
AS
CodeSuccess CONSTANT NUMBER := 0;
CoreError CONSTANT NUMBER := 2;
CodeAlreadyExists CONSTANT NUMBER := 3;
CodeBadProduct CONSTANT NUMBER := 4;
new_cdkey VARCHAR2(50);
old_cdkey VARCHAR2(50);
acommunitySeq NUMBER;
BEGIN
acommunitySeq := 0;
new_cdkey := '';
old_cdkey := '';
SELECT COMMUNITYSEQ INTO acommunityseq FROM COMMUNITY WHERE NAME = PRODUCT_IN;
returncode := CodeSuccess;
/*EXCEPTION
WHEN NO_DATA_FOUND THEN
returncode := CodeBadProduct; */
IF returncode = CodeSuccess THEN
BEGIN
SELECT CDKEY INTO old_cdkey FROM CDKEY WHERE EMAIL = in_email;
returncode := CodeBadProduct;
out_cdkey := old_cdkey;
RETURN;
EXCEPTION
WHEN NO_DATA_FOUND THEN
returncode := CodeSuccess;
END;
END IF;
IF returncode = CodeSuccess THEN
/*SELECT CDKEY into new_cdkey FROM CDKEY WHERE EMAIL = NULL AND COMMUNITYSEQ = acommunityseq; */
DECLARE
CURSOR c1
IS
SELECT CDKEY FROM CDKEY WHERE COMMUNITYSEQ = acommunityseq AND EMAIL = NULL;
BEGIN
OPEN c1;
FETCH c1 INTO new_cdkey;
IF ( c1%notfound ) THEN
returncode := CoreError;
END IF;
UPDATE cdkey SET EMAIL = in_email WHERE CDKEY = new_cdkey;
INSERT INTO user_hw VALUES( EMAIL = in_email, CPUID = in_cpuid,
MACID = in_macid, MACID2 = in_macid2, CPUCORES = in_pccores, PCNAME = in_pcname;
out_cdkey := new_cdkey;
returncode := CodeSuccess;
COMMIT;
END;
ELSE
returncode := CoreError;
ROLLBACK;
END IF;
END KEYREGISTRATION;
答案 0 :(得分:0)
您认为查询无效 - 您的推理是“因为查询将返回太多行。”那是不对的。使用条件ROWNUM = 1
添加WHERE子句(或添加到已有的过滤器) - 这将返回满足所有其他条件的第一行,处理将结束,您将获得此行和没别的。