CREATE TYPE some_employees_record IS RECORD
(emp_name VARCHAR2(4000)
,dept_name VARCHAR2(4000));
CREATE TYPE employees_tab_type IS TABLE OF some_employees_record;
CREATE OR REPLACE
FUNCTION some_employees
RETURN employees_tab_type
PIPELINED
IS
rec some_employees_record;
BEGIN
FOR record_name IN (SELECT (a.first_name || ' ' || a.last_name) complete_name,
b.DEPARTMENT_NAME complete_name2
FROM employees a , departments b
WHERE ROWNUM < 1000 and a.DEPARTMENT_ID=b.DEPARTMENT_ID)
LOOP
rec.emp_name := record_name.complete_name;
rec.dept_name := record_name.complete_name2;
PIPE ROW (rec);
END LOOP;
RETURN;
END;
Вы можете вызвать вышеуказанную функцию двумя способами. В SQL:
SELECT * FROM TABLE(some_employees);
или в PL/SQL:
DECLARE
rt employees_tab_type;
BEGIN
rt := some_employees;
FOR i IN 1..rt.COUNT LOOP
DBMS_OUTPUT.put_line(rt(i).emp_name || ', ' || rt(i).dept_name);
END LOOP;
END;
OT: вы понимаете, что запрос возвращает эффективно случайный (недетерминированный) набор 999 записей, если количество записей превышает 999 ?
Кстати, это было сделано, например, только для целей. Если ваше единственное требование - это функция для запуска запроса, я бы не сделал этого таким образом. Я бы вернул курсор, или (еще лучше) поставил запрос в представлении.
Вы хотите только напечатать или хотите, чтобы функция возвращала набор записей для дальнейших операций? Для первого используйте ответ @Sajmon, заменив кумулятивную конкатенацию на Put_Line. Для последнего вам нужно создать табличную функцию. – SQLCurious