【问题标题】:Error on my procedure我的程序出错
【发布时间】:2016-10-19 02:47:31
【问题描述】:

在我眼中,一切都是真实的。为什么它一直说警告:过程创建时出现编译错误?。请问有人能知道有什么问题吗?

【问题讨论】:

  • 把你的代码作为文本,而不是图像
  • 进行基本调试。一次添加一行以找到给您带来问题的行。但我告诉你,如果你希望一个用户拥有多个帐户 SELECT INTO 会失败
  • users. password .password 之间的空格在我看来是有问题的。同上users. user_id %type。要了解有关错误的更多信息,您可以尝试SELECT * FROM ALL_ERRORS WHERE NAME='LOGIN_USE'。祝你好运。
  • 如果您在 SQL*Plus 中编译该过程,则在编译后立即输入show errors(当您看到“创建时出现编译错误”消息时),或者show errors procedure login_use。如果您使用的是 SQL Developer 或 PL/SQL Developer 等工具,请了解如何让它自动显示编译错误。您不必猜测它们。

标签: oracle plsql


【解决方案1】:

“set serveroutput on”不适用于存储过程。

除非您确定结果是 1 条记录,否则切勿使用“选择进入”。 在您的示例中,结果也可以是 2 条(或更多)记录。

首先做一个游标来统计记录。 如果计数结果为 0(零),则显示该消息。如果计数结果为 1,则使用“select into”。更好的 open、fetch、close 构造。如果计数结果大于 1,则显示消息超过 1 (!!!) acounts。

这是与工作或学校相关的问题吗?

【讨论】:

    【解决方案2】:

    通过一些 OCR 和手动操作,我将您的程序设置为:

    create or replace procedure LOGIN_USE(USER_EMAIL IN VARCHAR, USER_PASSWORD IN
    VARCHAR) IS
    
    acttype users.account_type%type;
    psword users. password%type;
    acctuser users. user_id %type;
    message varchar(100) := 'User name or password are incorrect';
    
    Begin
    SELECT account_type, password, user_id INTO acttype, psword, acctuser
    FROM users
    WHERE email = USER_EMAIL;
    
    IF(psword = USER_PASSWORD) THEN
    dbms_output.put_line('Hello, and Welcome ' || USER_EMAIL);
    dbms_output.put_line('Account Type ' || acttype);
    ELSIF (acctuser >= 2) THEN
    dbms_output.put_line('Warning, You have more than two accounts');
    ELSE
    dbms_output.put_line(message);
    END IF;
    END;
    

    当整理好可读性(你应该养成自己这样做的习惯)时,我明白了:

    create or replace procedure login_use
        ( user_email    in varchar
        , user_password in varchar )
    as
        acttype  users.account_type%type;
        psword   users.password%type;
        acctuser users.user_id%type;
        message  varchar(100) := 'User name or password are incorrect';
    
    begin
        select account_type, password, user_id
        into   acttype,      psword,   acctuser
        from   users
        where  email = user_email;
    
        if psword = user_password then
            dbms_output.put_line('Hello, and Welcome ' || user_email);
            dbms_output.put_line('Account Type ' || acttype);
        elsif acctuser >= 2 then
            dbms_output.put_line('Warning, You have more than two accounts');
        else
            dbms_output.put_line(message);
        end if;
    end;
    

    在我创建 USERS 表后,这对我来说很好

    create table users
    ( account_type  varchar2(10)
    , password      varchar2(20)
    , user_id       integer
    , email         varchar2(50) );
    

    但是:

    1. 您应该使用varchar2 而不是varchar
    2. 我看不出将users.user_id 选择为acctuser(令人困惑的命名系统顺便说一句)然后检查该用户ID 是否大于1 以及如果是则警告用户拥有两个以上帐户的意义。 users 表中 user_id 的典型值是什么? ID大于1与账户数量有什么关系?你的意思是计算行数吗?如果users.email 不是唯一的,那么您需要重新考虑一下这种方法。
    3. 我非常希望这不适用于任何实际系统,因为它以纯文本形式存储密码。如果您将它们与电子邮件地址一起散列,至少会是一些东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-31
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2023-03-14
      相关资源
      最近更新 更多