PL/SQL process: issue with wording

南笙酒味 提交于 2020-01-22 02:30:11

问题


I am trying to create a page process in Oracle APEX 4.1. Specifically, When a button on this page is process submitting the page, I want this PL/SQL query to work. I don't have much of an understanding of PL/SQL and am looking to find out how to figure this issue out.

What I want the query to do:

I would like this page process to loop through each row in the EMPLOYEE table that I have in a database for APEX. For each row, I want to move the username, group and password into their own variables, and then to create an APEX user using the APEX_UTIL_CREATE_USER process. I want this to be done with every employee in the table.

I don't know specifically what is wrong with this PL/SQL, as I have never had to use it before. I would greatly appreciate any help anyone can give me with this. I will show the query and the error message below.

PL/SQL query:

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;

Error message:

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

The page number is 2.

Once again I would be greatly appreciative of any help I could gain.


回答1:


There are multiple issues with your procedure.

  1. You are missing the CREATE keyword, and that's the root cause for the compile time error. PLS-00103.

See the documentation for more details on CREATE PROCEDURE statement to create a standalone stored procedure or a call specification.

EMP_USERNAME IN EMPLOYEE

  1. The data type declaration for the IN parameter is incorrect. You need to do it as:
EMP_USERNAME IN EMPLOYEE.EMP_USERNAME%TYPE
  1. The FOR LOOP is syntactically incorrect.

FOR indx IN NVL (EMP_USERNAME.FIRST, 0) .. NVL (EMP_USERNAME.LAST, -1)

You could do it as:

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.

Now, let's test it and see:

SQL> set serveroutput on
SQL> EXEC deploy_emp(7369);
SMITH

PL/SQL procedure successfully completed.

SQL>



回答2:


use CREATE PROCEDURE to create a new stored procedure or EXEC <proc name> to execute it




回答3:


If you whant do all this in a page process, you don't need to create procedure. Put this code in the source of your page process:

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;


来源:https://stackoverflow.com/questions/30316936/pl-sql-process-issue-with-wording

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!