Выбрать столбцы на основе списка столбцов, представленных в другой таблице в базе данных Oracle? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть таблица T_FUNCTION в HR схема Oracle.

FUN_ID FUN_CMD                          
------ ---------------------------------
     1 substr(FIRST_NAME,2,2)           
     2 FIRST_NAME || ' ' || LAST_NAME   

Мне нужен запрос, который выберет FUN_CMD данные столбца из EMPLOYEES таблицы.

Пример-1: для FUN_ID = 1, мне нужно получить результат следующего SQL:

select substr(FIRST_NAME,2,2) from EMPLOYEES;

Пример-2: для FUN_ID = 2, мне нужно получить результат следующего SQL:

select FIRST_NAME || ' ' || LAST_NAME from EMPLOYEES;

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Это пахнет как динамический SQL или, возможно, лучший выбор, процедура, которая возвращает refcursor. Вот пример:

SQL> SELECT * FROM t_function;

    FUN_ID FUN_CMD
---------- ----------------------------------------
         1 substr(ename, 2, 2)
         2 ename ||' '|| job

SQL>
SQL> CREATE OR REPLACE PROCEDURE p_fun (
  2     par_fun_id   IN     t_function.fun_id%TYPE,
  3     p_out           OUT SYS_REFCURSOR)
  4  IS
  5     l_cmd   t_function.fun_cmd%TYPE;
  6     l_str   VARCHAR2 (200);
  7  BEGIN
  8     SELECT fun_cmd
  9       INTO l_cmd
 10       FROM t_function
 11      WHERE fun_id = par_fun_id;
 12
 13     l_str := 'select ' || l_cmd || ' from emp';
 14
 15     OPEN p_out FOR l_str;
 16  END;
 17  /

Procedure created.

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

SQL> var l_out refcursor
SQL> exec p_fun(1, :l_out);

PL/SQL procedure successfully completed.

SQL> print l_out

SU
--
MI
LL
AR
ON
AR
LA
LA
CO
IN
UR
DA
AM
OR
IL

14 rows selected.

И еще один:

SQL> exec p_fun(2, :l_out);

PL/SQL procedure successfully completed.

SQL> print l_out

ENAME||''||JOB
--------------------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK

14 rows selected.

SQL>
0 голосов
/ 08 мая 2018

CASE выражение будет полезно для вашего случая:

select
  (CASE FUN_ID WHEN 1 THEN substr(FIRST_NAME,2,2)
   ELSE FIRST_NAME || ' ' || LAST_NAME END) from EMPLOYEES;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...