为什么我一直收到这个错误? (8,5): PL/SQL: 语句被忽略
Why di I keep getting this Error? (8,5): PL/SQL: Statement ignored
我正在使用 PL/SQL 创建存储过程以创建具有所需格式的自动密码。
所需的格式来自员工 table 并且从那里获取不同的数据。
我一直收到此错误,错误 (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;
我希望存储过程仅在 table 名员工中创建用户后使用。
下一行有问题:
nuevo_password := lower(SUBSTR(FIRST_NAME, 1, 1)) || lower(FIRST_NAME) || employee_id || SUBSTR(PHONE_NUMBER, 1, 3);
您有两个选择,要么使用 select 查询 select 变量中的 FIRST_NAME、FIRST_NAME、PHONE_NUMBER 的值然后连接,要么将 select 写入查询并将此连接保存到 nuevo_password 变量中。
首先,我得到的错误(在创建 employees
table 之后)不仅仅是“Error(8,5): PL/SQL: Statement ignored”,而是
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
从安全的角度来看,您确定要生成 predictable 密码吗?如果是我,我宁愿直接设置为 dbms_random.string('a',10)
.
我正在使用 PL/SQL 创建存储过程以创建具有所需格式的自动密码。 所需的格式来自员工 table 并且从那里获取不同的数据。
我一直收到此错误,错误 (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;
我希望存储过程仅在 table 名员工中创建用户后使用。
下一行有问题:
nuevo_password := lower(SUBSTR(FIRST_NAME, 1, 1)) || lower(FIRST_NAME) || employee_id || SUBSTR(PHONE_NUMBER, 1, 3);
您有两个选择,要么使用 select 查询 select 变量中的 FIRST_NAME、FIRST_NAME、PHONE_NUMBER 的值然后连接,要么将 select 写入查询并将此连接保存到 nuevo_password 变量中。
首先,我得到的错误(在创建 employees
table 之后)不仅仅是“Error(8,5): PL/SQL: Statement ignored”,而是
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
从安全的角度来看,您确定要生成 predictable 密码吗?如果是我,我宁愿直接设置为 dbms_random.string('a',10)
.