【问题标题】:How can I fix these errors in plsql code?如何修复 plsql 代码中的这些错误?
【发布时间】:2023-01-20 16:08:22
【问题描述】:
CREATE TABLE user_man_sys(
    user_id      INT NOT NULL,
    user_name NVARCHAR2(20) NOT NULL,
    user_password INT    ,
    created_date DATE    ,
    PRIMARY KEY(user_id)
);


CREATE OR REPLACE PACKAGE mypackage AS
    PROCEDURE add_user(
                                      u_id              user_man_sys.user_id%type,
                                      u_name           user_man_sys.user_name%type,
                                      u_password      user_man_sys.user_password%type,
                                      u_created_data user_man_sys.created_date%type);
   PROCEDURE Checkuserlogin(new_username  user_man_sys.user_name%type,
                                              new_password  user_man_sys.user_password%type   )
  PROCEDURE rest_password ( r_password  user_man_sys.user_password%type)             
END mypackage ;
/



CREATE OR REPLACE PACKAGE BODY mypackage AS
    PROCEDURE add_user(
                                        u_id              user_man_sys.user_id%type,
                                      u_name           user_man_sys.user_name%type,
                                      u_password      user_man_sys.user_password%type,
                                      u_created_data user_man_sys.created_date%type)
                                       IS
       BEGIN
          INSERT INTO user_man_sys(user_id,user_name ,user_password  ,created_date)
            VALUES(u_id, u_name,u_password,u_created_data );
      END add_user;
   PROCEDURE Checkuserlogin(new_usernameuser_man_sys.user_name%type,
                                             new_password  user_man_sys.user_password%type)
          IS 
       BEGIN
          SET NOCOUNT ON

          SELECT CASE WHEN EXISTS(SELECT NULL FROM  user_man_sysWHERE user_id=new_username AND user_password=new_password)
          THEN CAST(1 AS BIT)
           ELSE CAST(0 AS BIT)
   END Checkuserlogin;
PROCEDURE   rest_password ( r_password  user_man_sys.user_password%type,r_user user_man_sys.user_name%type)
  IS
BEGIN
   UPDATE credentials
      SET password = r_password               -- use as parameter in procedure
    WHERE username = r_user;

   -- or you can include "and id = p_id" in where clause
   IF SQL%ROWCOUNT > 0
   THEN
      COMMIT;
      RETURN 'Password Reset Successful.';
   ELSE
      RETURN 'Password Reset Failed. Invalid User Name';
   END IF;
END rest_password  ;



   
end mypackage;
/

我的代码执行这些任务: 1)创建用户的过程。 2) 重置密码的程序。 3)检查登录红衣主教的程序。 如果我创建一个包或包的主体显示错误(包或包的主体配置有翻译错误),我想修复此代码中的此错误 我该如何解决?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    相当多的错误。

    表创建没有问题:

    SQL> CREATE TABLE user_man_sys
      2  (
      3     user_id         INT NOT NULL,
      4     user_name       NVARCHAR2 (20) NOT NULL,
      5     user_password   INT,
      6     created_date    DATE,
      7     PRIMARY KEY (user_id)
      8  );
    
    Table created.
    

    这是一张正在更新的表格;我没有,所以我正在创建一个假的一,只是为了编译包体:

    SQL> CREATE TABLE credentials
      2  (
      3     password   VARCHAR2 (10),
      4     username   VARCHAR2 (20)
      5  );
    
    Table created.
    

    包装规范:您缺少分号(作为终止符);正文中过程的描述必须与规范中的过程相匹配(那么rest_password 是错误的;另外,因为它不能 return 任何东西(它不是函数,我添加了一个 out 参数):

    SQL> CREATE OR REPLACE PACKAGE mypackage
      2  AS
      3     PROCEDURE add_user (u_id            user_man_sys.user_id%TYPE,
      4                         u_name          user_man_sys.user_name%TYPE,
      5                         u_password      user_man_sys.user_password%TYPE,
      6                         u_created_data  user_man_sys.created_date%TYPE);
      7
      8     PROCEDURE Checkuserlogin (new_username  user_man_sys.user_name%TYPE,
      9                               new_password  user_man_sys.user_password%TYPE);
     10
     11     PROCEDURE rest_password (r_password      user_man_sys.user_password%TYPE,
     12                              r_user          user_man_sys.user_name%TYPE,
     13                              par_result  OUT VARCHAR2);
     14  END mypackage;
     15  /
    
    Package created.
    

    包体:拼写错误(缺少空格); set属于SQL*Plus,不属于PL/SQL过程; Checkuserloginselect 语句需要 into 子句和有效数据类型(bit 不是):

    SQL> CREATE OR REPLACE PACKAGE BODY mypackage
      2  AS
      3     PROCEDURE add_user (u_id            user_man_sys.user_id%TYPE,
      4                         u_name          user_man_sys.user_name%TYPE,
      5                         u_password      user_man_sys.user_password%TYPE,
      6                         u_created_data  user_man_sys.created_date%TYPE)
      7     IS
      8     BEGIN
      9        INSERT INTO user_man_sys (user_id,
     10                                  user_name,
     11                                  user_password,
     12                                  created_date)
     13             VALUES (u_id,
     14                     u_name,
     15                     u_password,
     16                     u_created_data);
     17     END add_user;
     18
     19     PROCEDURE Checkuserlogin (new_username  user_man_sys.user_name%TYPE,
     20                               new_password  user_man_sys.user_password%TYPE)
     21     IS
     22        l_val  NUMBER;
     23     BEGIN
     24        --SET NOCOUNT ON
     25
     26        SELECT CASE
     27                  WHEN EXISTS
     28                          (SELECT NULL
     29                             FROM user_man_sys
     30                            WHERE     user_id = new_username
     31                                  AND user_password = new_password)
     32                  THEN
     33                     1
     34                  ELSE
     35                     0
     36               END
     37          INTO l_val
     38          FROM DUAL;
     39     END Checkuserlogin;
     40
     41     PROCEDURE rest_password (r_password      user_man_sys.user_password%TYPE,
     42                              r_user          user_man_sys.user_name%TYPE,
     43                              par_result  OUT VARCHAR2)
     44     IS
     45     BEGIN
     46        UPDATE credentials
     47           SET password = r_password            -- use as parameter in procedure
     48         WHERE username = r_user;
     49
     50        -- or you can include "and id = p_id" in where clause
     51        IF SQL%ROWCOUNT > 0
     52        THEN
     53           COMMIT;
     54           par_result := 'Password Reset Successful.';
     55        ELSE
     56           par_result := 'Password Reset Failed. Invalid User Name';
     57        END IF;
     58     END rest_password;
     59  END mypackage;
     60  /
    
    Package body created.
    
    SQL>
    

    就是这样,至于汇编问题有关。你的代码是否按照你的计划进行,我不知道。自己测试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-21
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      相关资源
      最近更新 更多