首页 > 解决方案 > 过程中的 PL/SQL DBMS 输出不显示

问题描述

我创建了这个过程来验证登录。第一个 IF 语句中的 DBMS OUTPUT 输出正常,但是当我输入无效信息时,ELSE 语句中的 DBMS OUTPUT 不显示任何内容;我不确定为什么?

    CREATE OR REPLACE PROCEDURE member_ck_sp
    (p_username IN VARCHAR2,
     p_password IN VARCHAR2)
     IS
     p_check VARCHAR2(10):= 'INVALID';
     fullname VARCHAR2(20);
    CURSOR member_cur IS
    SELECT username, firstname, lastname, cookie, password
    FROM bb_shopper
    WHERE username = p_username
        AND password = p_password;
     BEGIN
      FOR rec_cur IN member_cur LOOP
          IF p_username = rec_cur.username AND p_password = rec_cur.password THEN
              fullname := rec_cur.firstname || ' ' || rec_cur.lastname;
              DBMS_OUTPUT.PUT_LINE('Name: ' || fullname || ' Cookie: ' || rec_cur.cookie);
              DBMS_OUTPUT.PUT_LINE('LOGGED IN');
            ELSE
                DBMS_OUTPUT.PUT_LINE('INVALID');
          END IF;
      END LOOP;
      END member_ck_sp;
      
      
      
    BEGIN
        member_ck_sp('rat55', 'kile');
    END;

标签: sqlplsql

解决方案


正如您对游标使用了以下 SQL 查询,并且当您提供无效输入时for loop,迭代游标值将not found跳过迭代循环,因此您的程序将在不通知输入无效的情况下结束。您可以使用 aflag variable来通知您 for 循环是否运行。

SELECT username, firstname, lastname, cookie, password
FROM bb_shopper
WHERE username = p_username
    AND password = p_password;

CREATE OR REPLACE PROCEDURE member_ck_sp
(p_username IN VARCHAR2,
 p_password IN VARCHAR2)
 IS
 p_check VARCHAR2(10):= 'INVALID';
 fullname VARCHAR2(20);
 data_present BOOLEAN := FALSE;
CURSOR member_cur IS
SELECT username, firstname, lastname, cookie, password
FROM bb_shopper
WHERE username = p_username
    AND password = p_password;
 BEGIN
  FOR rec_cur IN member_cur LOOP
      IF p_username = rec_cur.username AND p_password = rec_cur.password THEN
          fullname := rec_cur.firstname || ' ' || rec_cur.lastname;
          DBMS_OUTPUT.PUT_LINE('Name: ' || fullname || ' Cookie: ' || rec_cur.cookie);
          DBMS_OUTPUT.PUT_LINE('LOGGED IN');
          data_present := TRUE;
      END IF;
  END LOOP;
  --Checking Invalid input 
  IF NOT data_present 
  THEN
  DBMS_OUTPUT.PUT_LINE('INVALID');
  END IF;
  END member_ck_sp;

推荐阅读