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。

如果我能获得任何帮助,我将再次感激不尽。

您的程序存在多个问题。

  1. 您缺少 CREATE 关键字,这是编译时错误的根本原因。 PLS-00103.

有关CREATE PROCEDURE statement创建独立存储过程或调用规范的更多详细信息,请参阅文档。

EMP_USERNAME IN EMPLOYEE

  1. IN 参数的数据类型声明不正确。你需要这样做:
EMP_USERNAME IN EMPLOYEE.EMP_USERNAME%TYPE
  1. 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;