Oracle在返回多行时检索单行的问题

时间:2016-09-21 15:29:41

标签: database oracle stored-procedures cursors

我有一个问题,我已经花了大约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;

1 个答案:

答案 0 :(得分:0)

认为查询无效 - 您的推理是“因为查询将返回太多行。”那是不对的。使用条件ROWNUM = 1添加WHERE子句(或添加到已有的过滤器) - 这将返回满足所有其他条件的第一行,处理将结束,您将获得此行和没别的。