Oracle 11g - как вернуть запись из функции с объединением таблиц - PullRequest
0 голосов
/ 19 февраля 2019

В Oracle 11g я пытаюсь вернуть несколько столбцов из вызова функции, который объединен с таблицами.Эта функция принимает employee_id в качестве входных данных и должна возвращать first_name и last_name как два отдельных столбца из таблицы employee.

Я создал тип

create or replace
type mytype as object
  ( val_1 varchar2(100),
    val_2 number
  );
/

И функция

create or replace
function myfunc(p_in number) return mytype is
    v_deptname varchar2(100);
    v_mgrid number;
begin
    select department_name,manager_id into v_deptname,v_mgrid from DEPARTMENTS  where department_id = p_in;
return
 mytype(v_deptname,v_mgrid);
end;
/

Оба успешно созданы.Но когда я выполняю функцию,

select employee_id, salary, myfunc(department_id) from EMPLOYEES where employee_id in(100,101); 

Это дает результат, как показано ниже,

EMPLOYEE_ID     SALARY
----------- ----------
MYFUNC(DEPARTMENT_ID)(VAL_1, VAL_2)
--------------------------------------------------------------------------------
        100      24000
MYTYPE('Executive', 100)

        101      17000
MYTYPE('Executive', 100)

Но я хочу, чтобы мой результат был похож на

EMPLOYEE_ID     SALARY VAL_1                               VAL_2
----------- ---------- ------------------------------ ----------
        100      24000 Executive                             100
        101      17000 Executive                             100

Пожалуйста, помогитедля достижения этой цели.Спасибо

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы можете попробовать, как показано ниже:

--Tables

CREATE TABLE dept (
    deptno   NUMBER,
    dname    VARCHAR2 (20),
    loc      VARCHAR2 (20)
);
/  

CREATE TABLE employee (
    employee_id   NUMBER,
    salary        NUMBER
);

Код:

CREATE OR REPLACE TYPE mytype AS OBJECT (
    deptno   NUMBER,
    dname    VARCHAR2 (20),
    loc      VARCHAR2 (20)
);

CREATE OR REPLACE TYPE mytab AS TABLE OF mytype;

CREATE OR REPLACE FUNCTION myfunc ( p_in NUMBER) 
RETURN mytab 
IS
    v_var   mytab := mytab ();
BEGIN
    SELECT
        mytype (
            deptno,
            dname,
            loc
        )
    BULK COLLECT INTO
        v_var
    FROM
        dept
    WHERE
        deptno = p_in;
    return (v_var);
END myfunc;
/

Исполнение:

SELECT
    e.*,
    t.deptno,
    t.dname   
FROM
    employee e
    CROSS JOIN 
     TABLE ( myfunc (100) ) t ;

Выход:

Employee_Id  SALARY DEPT DNAME      
---------    ------ ---- ------    
1001         20000  100  Executive  
1002         25000  100  Executive
0 голосов
/ 19 февраля 2019

Ну, возможно, вам не хватает еще одного типа, основанного на MYTYPE.

Вот пример (я использую схему Скотта, поскольку у меня нет ваших таблиц).Я добавил DEPTNO в MYTYPE, чтобы иметь возможность объединить результат (возвращаемый функцией) с таблицей EMP.

Вот что у вас есть:

SQL> create or replace type mytype as object
  2    (deptno number,
  3     dname  varchar2(20),
  4     loc    varchar2(20));
  5  /

Type created.

Это то, что вам не хватает:

SQL> create or replace type mytab as table of mytype;
  2  /

Type created.

Функция: строка примечания 9:

SQL> create or replace function myfunc (p_in number) return mytab is
  2    v_dname varchar2(20);
  3    v_loc   varchar2(20);
  4  begin
  5    select dname, loc
  6      into v_dname, v_loc
  7      from dept
  8      where deptno = p_in;
  9    return mytab(mytype(p_in, v_dname, v_loc));
 10  end myfunc;
 11  /

Function created.

Тестирование:

SQL> select * from table(myfunc(10));

    DEPTNO DNAME                LOC
---------- -------------------- --------------------
        10 ACCOUNTING           NEW YORK

SQL>
SQL> select e.ename, e.sal, m.dname, m.loc
  2  from emp e join table(myfunc(e.deptno)) m on m.deptno = e.deptno
  3  where e.deptno = 10
  4  order by m.dname, e.ename;

ENAME             SAL DNAME                LOC
---------- ---------- -------------------- --------------------
CLARK            2450 ACCOUNTING           NEW YORK
KING            10000 ACCOUNTING           NEW YORK
MILLER           1300 ACCOUNTING           NEW YORK

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...