我试图在Oracle APEX 4.1中创建一个页面进程。具体来说,当这个页面上的一个按钮是提交页面的过程时,我希望这个PL/SQL查询工作。我对PL/SQL没有太多的了解,我正在寻找如何解决这个问题。
我想要查询做什么:
我希望这个页面进程循环遍历APEX数据库中EMPLOYEE表中的每一行。对于每一行,我想将用户名、组和密码移动到它们自己的变量中,然后使用APEX_UTIL_CREATE_USER进程创建一个APEX用户。我希望对表中的每个员工都这样做。
我不知道这个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语句创建独立存储过程或调用规范的更多详细信息,请参阅文档。
EMP_USERNAME IN EMPLOYEE
- IN参数的数据类型声明错误。你需要这样做:
EMP_USERNAME IN EMPLOYEE。EMP_USERNAME %类型之前FOR LOOP语法错误
FOR索引在NVL (EMP_USERNAME)。首先,……NVL (EMP_USERNAME。最后,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;