Динамически выбрать имя столбца в операторе вставки Oracle - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть таблица, структура которой показана ниже:

SALES_RECS
---------------------------------------------------------------------
| DEPT | LOCATION | NUMBER1 | NUMBER2 | NUMBER3 | NUMBER4 | NUMBER5 |
---------------------------------------------------------------------

У меня есть процедура, в которой я буду вставлять данные в эту таблицу. Но при вставке данных мне нужно выбирать между столбцами от NUMBER1 до NUMBER5 на основе определенных критериев. Поэтому я установил динамический выбор этого столбца, как показано ниже:

-- BELOW VALUE WOULD BE RETRIEVED DYNAMICALLY
num_val := 4 

INSERT INTO SALES_RECS(DEPT, LOCATION, NUMBER||num_val)
VALUES ('CC', 'HOUSTON', 5000);

Я получаю следующую ошибку, как указано ниже:

PL/SQL: ORA-01747: invalid user.table.column, table.column, or column specification

Я не уверен, как динамически выбирать / устанавливать имя столбца в операторе вставки.

Большое спасибо за потраченное время и помощь заранее!

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Это Dynami c SQL вам нужно. Вот пример.

SQL> create table test (dept varchar2(2), number1 number, number2 number);

Table created.

На основании значения параметра PAR_DEPT процедура будет вставлена ​​в столбцы number1 или number2.

SQL> create or replace procedure p_test (par_dept in varchar2)
  2  is
  3    l_Str  varchar2(200);
  4    l_col  varchar2(30) := 'NUMBER';
  5  begin
  6    if par_dept = 'CC' then
  7       l_col := l_col || '1';
  8    else
  9       l_col := l_col || '2';
 10    end if;
 11
 12    l_str := 'insert into test (dept, ' || l_col || ')' ||
 13             '  values (' || chr(39) || par_dept || chr(39) || ', 5000)';
 14    execute immediate l_str;
 15  end;
 16  /

Procedure created.

Проверка:

SQL> exec p_test('CC');

PL/SQL procedure successfully completed.

SQL> select * From test;

DE    NUMBER1    NUMBER2
-- ---------- ----------
CC       5000

SQL> exec p_test('AB');

PL/SQL procedure successfully completed.

SQL> select * From test;

DE    NUMBER1    NUMBER2
-- ---------- ----------
CC       5000
AB                  5000

SQL>
1 голос
/ 08 апреля 2020

Вы можете использовать данные c sql, используя DECODE следующим образом:

INSERT INTO SALES_RECS(DEPT, LOCATION, NUMBER1,NUMBER2,NUMBER3,NUMBER4,NUMBER5)
Select 'CC', 'HOUSTON',
       DECODE(NUM_VAL,1,5000),
       DECODE(NUM_VAL,2,5000),
       DECODE(NUM_VAL,3,5000),
       DECODE(NUM_VAL,4,5000),
       DECODE(NUM_VAL,5,5000)
  FROM DUAL;
...