PL/SQL进程:措辞问题



我试图在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。

如果您能给予我任何帮助,我将非常感激。

你的程序有多个问题。

  1. 您缺少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;
    

    最新更新