Найти объект из списка объектов в plsql - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь написать функцию plsql, которая принимает employee_list (список сотрудников) и имя сотрудника (тип varchar2) в качестве параметра, затем перебирает список сотрудников, пока не найдет сотрудника с соответствующим именем. Как только объект найден, функция возвращается с адресом сотрудника.

EMPLOYEE_OBJ Тип

CREATE OR REPLACE TYPE EMPLOYEE_OBJ AS OBJECT 
(name varchar2(1000), 
 address varchar2(1000)
);

Тип EMPLOYEE_OBJ_ARRAY (массив EMPLOYEE_OBJ)

CREATE OR REPLACE TYPE EMPLOYEE_OBJ_ARRAY AS VARRAY(100) OF EMPLOYEE_OBJ;

Функция для получения значения объекта

create or replace FUNCTION GET_EMPLOYEE_ADDRESS (employee_list EMPLOYEE_OBJ_ARRAY,name varchar2)
RETURN VARCHAR2
IS
BEGIN 
FOR i in 1 .. employee_list.count LOOP 
      IF employee_list(i).name = name THEN
         return employee_list(i).address;
      END IF;
   END LOOP;
RETURN NULL;
END;

ОШИБКА, которую я получаю:

ORA-24344: success with compilation error
ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_190100", line 590
ORA-06512: at "SYS.DBMS_SYS_SQL", line 1658
ORA-06512: at "SYS.WWV_DBMS_SQL_APEX_190100", line 576
ORA-06512: at "APEX_190100.WWV_FLOW_DYNAMIC_EXEC", line 2033

Не могли бы вы помочь мне решить эту проблему. Также есть ли более простой способ сделать это? как запрос на выбор.

1 Ответ

1 голос
/ 19 мая 2019

Несмотря на то, что предоставленный FUNCTION, по-видимому, компилируется и выполняется нормально по крайней мере на нескольких версиях Oracle, существует способ получить адрес без перебора коллекции.Ниже приведен пример использования указанных вами типов:

CREATE OR REPLACE TYPE EMPLOYEE_OBJ AS OBJECT 
(name varchar2(1000), 
 address varchar2(1000)
);
CREATE OR REPLACE TYPE EMPLOYEE_OBJ_ARRAY AS VARRAY(100) OF EMPLOYEE_OBJ;

И запрос:

SELECT ADDRESS FROM TABLE (EMPLOYEE_OBJ_ARRAY(
                      EMPLOYEE_OBJ('John','Finland'),
                      EMPLOYEE_OBJ('Molly','Spain')))
WHERE NAME = 'John';

Результат:

   ADDRESS
__________
Finland


1 row selected.
...