Как я могу получить имя таблицы из переданного параметра в Oracle DB? - PullRequest
0 голосов
/ 14 февраля 2020

Я создал функцию в oracle дБ с (В параметре), параметр определил, какую таблицу я передал при вызове функции, поэтому мне нужно получить имя таблицы из параметра и использовать его в своем запросе внутри функции. Пример как ниже:

CREATE OR REPLACE TYPE EMP_OBJ_TYPE AS OBJECT

(

column1 varchar2(20),

column2 varchar2(20),

column3 varchar2(20)

)
;

CREATE OR REPLACE TYPE EMP_TBL_TYPE IS TABLE OF EMP_OBJ_TYPE;

CREATE OR REPLACE FUNCTION EMPLOYEE_FUNCTION (table_name varchar2)

RETURN EMP_TBL_TYPE IS

EMP_DETAILS EMP_TBL_TYPE := EMP_TBL_TYPE();

BEGIN

EMP_DETAILS.EXTEND();

SELECT EMP_OBJ_TYPE (column1, column2, colmn3)

BULK COLLECT
INTO EMP_DETAILS

FROM (SELECT column1, column2, column3

From emloyees a

join table_name b

on a.emp_id = b.emp_id);

RETURN EMP_DETAILS;

END;

1 Ответ

0 голосов
/ 14 февраля 2020

Для этого вам понадобится динами c SQL. Вот как: я использую пример схемы Скотта, пытаясь Мими c, что у вас есть.

SQL> CREATE TABLE employees
  2  AS
  3     SELECT deptno emp_id,
  4            ename column1,
  5            job column2,
  6            TO_CHAR (hiredate, 'dd.mm.yyyy') column3
  7       FROM emp;

Table created.

Ваши типы:

SQL> CREATE OR REPLACE TYPE emp_obj_type AS OBJECT
  2  (
  3     column1 VARCHAR2 (20),
  4     column2 VARCHAR2 (20),
  5     column3 VARCHAR2 (20)
  6  );
  7  /

Type created.

SQL> CREATE OR REPLACE TYPE emp_tbl_type IS TABLE OF emp_obj_type;
  2  /

Type created.

Функция: рекомендуется сначала отобразить оператор, который вы собираетесь выполнить, чтобы визуально убедиться в его правильности (строка № 14); удалите его, когда он больше не нужен.

SQL> CREATE OR REPLACE FUNCTION employee_function (par_table_name VARCHAR2)
  2     RETURN emp_tbl_type
  3  IS
  4     emp_details  emp_tbl_type := emp_tbl_type ();
  5     l_str        VARCHAR2 (1000);
  6  BEGIN
  7     l_str :=
  8           'SELECT EMP_OBJ_TYPE (column1, column2, column3) '
  9        || '  FROM (SELECT column1, column2, column3 '
 10        || '        FROM employees a JOIN '
 11        || par_table_name
 12        || ' b ON a.emp_id = b.deptno)';
 13
 14     -- DBMS_OUTPUT.put_line (l_str);
 15
 16     EXECUTE IMMEDIATE l_str BULK COLLECT INTO emp_details;
 17
 18     RETURN emp_details;
 19  END;
 20  /

Function created.

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

SQL> SELECT employee_function ('dept') FROM DUAL;

EMPLOYEE_FUNCTION('DEPT')(COLUMN1, COLUMN2, COLUMN3)
--------------------------------------------------------------------------------
EMP_TBL_TYPE(EMP_OBJ_TYPE('SMITH', 'CLERK', '17.12.1980'), EMP_OBJ_TYPE('ALLEN',
 'SALESMAN', '20.02.1981'), EMP_OBJ_TYPE('WARD', 'SALESMAN', '22.02.1981'), EMP_
OBJ_TYPE('JONES', 'MANAGER', '02.04.1981'), EMP_OBJ_TYPE('MARTIN', 'SALESMAN', '
28.09.1981'), EMP_OBJ_TYPE('BLAKE', 'MANAGER', '01.05.1981'), EMP_OBJ_TYPE('CLAR
K', 'MANAGER', '09.06.1981'), EMP_OBJ_TYPE('SCOTT', 'ANALYST', '09.12.1982'), EM
P_OBJ_TYPE('KING', 'PRESIDENT', '17.11.1981'), EMP_OBJ_TYPE('TURNER', 'SALESMAN'
, '08.09.1981'), EMP_OBJ_TYPE('ADAMS', 'CLERK', '12.01.1983'), EMP_OBJ_TYPE('JAM
ES', 'CLERK', '03.12.1981'), EMP_OBJ_TYPE('FORD', 'ANALYST', '03.12.1981'), EMP_
OBJ_TYPE('MILLER', 'CLERK', '23.01.1982'))


SQL>
...