0

我正在使用 PL/SQL 创建一个存储过程,以创建具有所需格式的自动密码。所需的格式来自员工表,并从那里获取不同的数据。

我一直收到这个错误,错误(8,5):PL/SQL:语句被忽略。我的代码是这样的:

CREATE OR REPLACE PROCEDURE sp_password(e_id NUMBER)
IS
    nuevo_password employees.password%TYPE; 

begin
    nuevo_password := lower(SUBSTR(FIRST_NAME, 1, 1)) || lower(LAST_NAME) ||  employee_id || SUBSTR(PHONE_NUMBER, 1, 3);

    select nuevo_password into password from employees; 
    UPDATE employees SET password = nuevo_password WHERE employee_id = e_id;
    
    DBMS_OUTPUT.PUT_LINE('El password para el empleado' || e_id || 'se ha generado exitosamente');
    DBMS_OUTPUT.PUT_LINE('El nuevo password es: ' || nuevo_password);
END;

我希望仅在表员工中创建用户后才使用存储过程。

4

2 回答 2

0

问题出在以下行:

nuevo_password := lower(SUBSTR(FIRST_NAME, 1, 1)) || lower(FIRST_NAME) ||  employee_id || SUBSTR(PHONE_NUMBER, 1, 3);

您有两个选项,要么使用选择查询在变量中选择 FIRST_NAME、FIRST_NAME、PHONE_NUMBER 的值,然后进行连接,要么将选择写入查询并将此连接保存到 nuevo_password 变量中。

于 2021-07-01T17:31:59.610 回答
0

首先,我得到的错误(在创建employees表之后)不仅仅是“错误(8,5):PL/SQL:语句被忽略”,而是

LINE/COL   ERROR
---------- ---------------------------------------------------------
6/5        PL/SQL: Statement ignored
6/36       PLS-00201: identifier 'FIRST_NAME' must be declared
9/5        PL/SQL: SQL Statement ignored
9/32       PLS-00201: identifier 'PASSWORD' must be declared
9/41       PL/SQL: ORA-00904: : invalid identifier

因此,了解如何在您使用的任何工具中报告编译错误是值得的。

错误告诉您FIRST_NAME并且PASSWORD未声明为变量。

一旦你声明了缺失的变量,你需要使用一个select into构造来填充它们,指定employee_id。就个人而言,我会将整个员工行提取到记录中,而不是管理多个单独的变量。

create or replace procedure set_password(e_id number)
is
    emp employees%rowtype;
begin
    select * into emp
    from   employees e
    where  e.employee_id = e_id; 

    emp.password :=
        lower(substr(emp.first_name, 1, 1)) ||
        lower(emp.last_name) ||
        emp.employee_id ||
        substr(emp.phone_number, 1, 3);

    update employees e
    set    password = emp.password
    where  employee_id = e_id;
    
    dbms_output.put_line('El password para el empleado ' || e_id || ' se ha generado exitosamente');
    dbms_output.put_line('El nuevo password es: ' || emp.password);
end set_password;

测试值:

create table employees
( employee_id
, first_name
, last_name
, phone_number
, password )
as
select 123
     , 'Karl'
     , 'Marx'
     , '07345678910'
     , cast('' as varchar2(50))
from dual;
call set_password(123);

El password para el empleado 123 se ha generado exitosamente
El nuevo password es: kmarx123073

从安全角度来看,您确定要生成可预测的密码吗?如果是我,我宁愿将其设置为dbms_random.string('a',10).

于 2021-07-01T18:47:22.697 回答