PL/SQL 流程:措辞有问题
PL/SQL process: issue with wording
我正在尝试在 Oracle APEX 4.1 中创建页面进程。具体来说,当此页面上的按钮正在提交页面时,我希望此 PL/SQL 查询起作用。我对 PL/SQL 了解不多,正在寻找解决此问题的方法。
我希望查询做什么:
我希望此页面进程循环遍历我在 APEX 数据库中拥有的 EMPLOYEE table 中的每一行。对于每一行,我想将用户名、组和密码移动到它们自己的变量中,然后使用 APEX_UTIL_CREATE_USER 过程创建一个 APEX 用户。我希望 table 中的每个员工都这样做。
我不知道这个 PL/SQL 具体有什么问题,因为我以前从未用过它。我将不胜感激任何人能给我的任何帮助。我将在下面显示查询和错误消息。
PL/SQL 查询:
PROCEDURE deploy_employee
(EMP_USERNAME IN EMPLOYEE)
IS
BEGIN
FOR indx IN NVL (EMP_USERNAME.FIRST, 0)
.. NVL (EMP_USERNAME.LAST, -1)
LOOP
emp_user EMPLOYEE.EMP_USERNAME%TYPE;
emp_pass EMPLOYEE.EMP_PASSWORD%TYPE;
emp_group EMPLOYEE.EMP_GROUP%TYPE;
BEGIN
BEGIN
select EMP_USERNAME into emp_user from EMPLOYEE;
select EMP_PASSWORD into emp_pass from EMPLOYEE;
select EMP_GROUP into emp_group FROM EMPLOYEE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
emp_user := NULL;
emp_pass := NULL;
emp_group := NUL;
END;
APEX_UTIL.CREATE_USER(
p_user_name => emp_user,
p_web_password => emp_pass,
p_user_group => emp_gorup,
);
END;
END LOOP;
END deploy_employee;
错误信息:
1 error has occurred ORA-06550: line 2, column 1: PLS-00103:
Encountered the symbol "PROCEDURE" when expecting one of the
following: ( begin case declare end exception exit for goto if loop
mod null pragma raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> << continue
close current delete fetch lock insert open rollback savepoint set sql
execute commit forall merge pipe purge The symbol "declare" was
substituted for "PROCEDURE" to continue. ORA-065
页码是2。
如果我能获得任何帮助,我将再次感激不尽。
您的程序存在多个问题。
- 您缺少 CREATE 关键字,这是编译时错误的根本原因。
PLS-00103
.
有关CREATE PROCEDURE statement创建独立存储过程或调用规范的更多详细信息,请参阅文档。
EMP_USERNAME IN EMPLOYEE
- IN 参数的数据类型声明不正确。你需要这样做:
EMP_USERNAME IN EMPLOYEE.EMP_USERNAME%TYPE
- FOR 循环在语法上不正确。
FOR indx IN NVL (EMP_USERNAME.FIRST, 0) .. NVL (EMP_USERNAME.LAST, -1)
您可以这样做:
SQL> CREATE OR REPLACE
2 PROCEDURE deploy_emp(
3 i_emp emp.empno%type)
4 IS
5 emp_user VARCHAR2(50);
6 BEGIN
7 FOR indx IN
8 (SELECT ename FROM emp
9 )
10 LOOP
11 BEGIN
12 BEGIN
13 SELECT ename INTO emp_user FROM emp WHERE empno = i_emp;
14 EXCEPTION
15 WHEN NO_DATA_FOUND THEN
16 emp_user := NULL;
17 END;
18 END;
19 END LOOP;
20 dbms_output.put_line(emp_user);
21 END deploy_emp;
22 /
Procedure created.
SQL> sho err
No errors.
现在,让我们测试一下看看:
SQL> set serveroutput on
SQL> EXEC deploy_emp(7369);
SMITH
PL/SQL procedure successfully completed.
SQL>
使用CREATE PROCEDURE
创建新的存储过程或EXEC <proc name>
执行它
如果您希望在页面进程中完成所有这些操作,则无需创建过程。将此代码放入页面进程的源代码中:
BEGIN
FOR indx IN (
select *
from EMPLOYEE
) LOOP
APEX_UTIL.CREATE_USER(
p_user_name => indx.EMP_USERNAME,
p_web_password => indx.EMP_PASSWORD,
p_user_group => indx.EMP_GROUP,
);
END LOOP;
END;
我正在尝试在 Oracle APEX 4.1 中创建页面进程。具体来说,当此页面上的按钮正在提交页面时,我希望此 PL/SQL 查询起作用。我对 PL/SQL 了解不多,正在寻找解决此问题的方法。
我希望查询做什么:
我希望此页面进程循环遍历我在 APEX 数据库中拥有的 EMPLOYEE table 中的每一行。对于每一行,我想将用户名、组和密码移动到它们自己的变量中,然后使用 APEX_UTIL_CREATE_USER 过程创建一个 APEX 用户。我希望 table 中的每个员工都这样做。
我不知道这个 PL/SQL 具体有什么问题,因为我以前从未用过它。我将不胜感激任何人能给我的任何帮助。我将在下面显示查询和错误消息。
PL/SQL 查询:
PROCEDURE deploy_employee
(EMP_USERNAME IN EMPLOYEE)
IS
BEGIN
FOR indx IN NVL (EMP_USERNAME.FIRST, 0)
.. NVL (EMP_USERNAME.LAST, -1)
LOOP
emp_user EMPLOYEE.EMP_USERNAME%TYPE;
emp_pass EMPLOYEE.EMP_PASSWORD%TYPE;
emp_group EMPLOYEE.EMP_GROUP%TYPE;
BEGIN
BEGIN
select EMP_USERNAME into emp_user from EMPLOYEE;
select EMP_PASSWORD into emp_pass from EMPLOYEE;
select EMP_GROUP into emp_group FROM EMPLOYEE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
emp_user := NULL;
emp_pass := NULL;
emp_group := NUL;
END;
APEX_UTIL.CREATE_USER(
p_user_name => emp_user,
p_web_password => emp_pass,
p_user_group => emp_gorup,
);
END;
END LOOP;
END deploy_employee;
错误信息:
1 error has occurred ORA-06550: line 2, column 1: PLS-00103:
Encountered the symbol "PROCEDURE" when expecting one of the
following: ( begin case declare end exception exit for goto if loop
mod null pragma raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> << continue
close current delete fetch lock insert open rollback savepoint set sql
execute commit forall merge pipe purge The symbol "declare" was
substituted for "PROCEDURE" to continue. ORA-065
页码是2。
如果我能获得任何帮助,我将再次感激不尽。
您的程序存在多个问题。
- 您缺少 CREATE 关键字,这是编译时错误的根本原因。
PLS-00103
.
有关CREATE PROCEDURE statement创建独立存储过程或调用规范的更多详细信息,请参阅文档。
EMP_USERNAME IN EMPLOYEE
- IN 参数的数据类型声明不正确。你需要这样做:
EMP_USERNAME IN EMPLOYEE.EMP_USERNAME%TYPE
- FOR 循环在语法上不正确。
FOR indx IN NVL (EMP_USERNAME.FIRST, 0) .. NVL (EMP_USERNAME.LAST, -1)
您可以这样做:
SQL> CREATE OR REPLACE
2 PROCEDURE deploy_emp(
3 i_emp emp.empno%type)
4 IS
5 emp_user VARCHAR2(50);
6 BEGIN
7 FOR indx IN
8 (SELECT ename FROM emp
9 )
10 LOOP
11 BEGIN
12 BEGIN
13 SELECT ename INTO emp_user FROM emp WHERE empno = i_emp;
14 EXCEPTION
15 WHEN NO_DATA_FOUND THEN
16 emp_user := NULL;
17 END;
18 END;
19 END LOOP;
20 dbms_output.put_line(emp_user);
21 END deploy_emp;
22 /
Procedure created.
SQL> sho err
No errors.
现在,让我们测试一下看看:
SQL> set serveroutput on
SQL> EXEC deploy_emp(7369);
SMITH
PL/SQL procedure successfully completed.
SQL>
使用CREATE PROCEDURE
创建新的存储过程或EXEC <proc name>
执行它
如果您希望在页面进程中完成所有这些操作,则无需创建过程。将此代码放入页面进程的源代码中:
BEGIN
FOR indx IN (
select *
from EMPLOYEE
) LOOP
APEX_UTIL.CREATE_USER(
p_user_name => indx.EMP_USERNAME,
p_web_password => indx.EMP_PASSWORD,
p_user_group => indx.EMP_GROUP,
);
END LOOP;
END;