Я хочу вставить все данные столбцов таблицы в другую таблицу в виде строк - PullRequest
0 голосов
/ 06 марта 2020

- Создать таблицу

create table RADIOLOGY.TEST_DATA
(
  EMP_ID         VARCHAR2(100),
  EMP_NAME       VARCHAR2(500),
  EMP_CONTACT_NO VARCHAR2(500),
  EMP_ADDRESS    VARCHAR2(500),
  EMP_GENDER     VARCHAR2(500)
);

Данные таблицы представлены в виде

1   JOHN    03000000    LONDON  MALE

, и я хочу выводить как

EMP_ID         1
EMP_NAME       JOHN
EMP_CONTACT_NO 03000000
EMP_ADDRESS    LONDON
EMP_GENDER     MALE

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Вы можете использовать unpivot для преобразования данных строки в данные столбца:

select * 
  from test_data  
unpivot include nulls
( val for col in (emp_id, emp_name, emp_contact_no, emp_address, emp_gender ) ) 

Демо

0 голосов
/ 06 марта 2020

Ваш вопрос:

Я хочу вставить все данные столбцов таблицы в другую таблицу в виде строк

Что это значит? Не имеет никакого смысла вообще. И вот почему: когда я увидел это, моей первой мыслью была процедура print_table. Я не могу вспомнить, кто является первоначальным автором (я не); Спроси Тома или кого-то еще, я действительно не знаю, и я прошу прощения за это.

Вот оно:

SQL> set serveroutput on
SQL> create or replace procedure print_table (p_query in varchar2)
  2     authid current_user
  3  is
  4     l_thecursor     integer default dbms_sql.open_cursor;
  5     l_columnvalue   varchar2 (4000);
  6     l_status        integer;
  7     l_desctbl       dbms_sql.desc_tab;
  8     l_colcnt        number;
  9  begin
 10     execute immediate 'alter session set
 11          nls_date_format=''dd.mm.yyyy hh24:mi:ss'' ';
 12
 13     dbms_sql.parse (l_thecursor, p_query, dbms_sql.native);
 14     dbms_sql.describe_columns (l_thecursor, l_colcnt, l_desctbl);
 15
 16     for i in 1 .. l_colcnt
 17     loop
 18        dbms_sql.define_column (l_thecursor,
 19                                i,
 20                                l_columnvalue,
 21                                4000);
 22     end loop;
 23
 24     l_status := dbms_sql.execute (l_thecursor);
 25
 26     while (dbms_sql.fetch_rows (l_thecursor) > 0)
 27     loop
 28        for i in 1 .. l_colcnt
 29        loop
 30           dbms_sql.column_value (l_thecursor, i, l_columnvalue);
 31           dbms_output.
 32            put_line (
 33              rpad (l_desctbl (i).col_name, 30) || ': ' || l_columnvalue);
 34        end loop;
 35
 36        dbms_output.put_line ('-----------------');
 37     end loop;
 38
 39  end;
 40  /

Procedure created.

Что это делает? Представляет данные в нужном вам формате:

SQL> exec print_table('select * from emp where deptno = 30');
EMPNO                         : 7499
ENAME                         : ALLEN
JOB                           : SALESMAN
MGR                           : 7698
HIREDATE                      : 20.02.1981 00:00:00
SAL                           : 1600
COMM                          : 300
DEPTNO                        : 30
-----------------
EMPNO                         : 7521
ENAME                         : WARD
JOB                           : SALESMAN
MGR                           : 7698
HIREDATE                      : 22.02.1981 00:00:00
SAL                           : 1250
COMM                          : 500
DEPTNO                        : 30
-----------------
EMPNO                         : 7654
ENAME                         : MARTIN
JOB                           : SALESMAN
MGR                           : 7698
HIREDATE                      : 28.09.1981 00:00:00
SAL                           : 1250
COMM                          : 1400
DEPTNO                        : 30
<snip>

Теперь вернемся к «нет смысла»: как именно вы планируете вставить что-то подобное в другую таблицу? Как выглядит эта «другая таблица»? Имеет ли он (до) 1000 столбцов (что является / было пределом), например, каждый сотрудник будет вставлен в один столбец? Я никогда не видел такой модели данных. Как бы вы использовали это? Подарите конечным пользователям? Честно говоря, не знаю, и мне это совсем не нравится.

Если я неправильно понял проблему, объясните, пожалуйста.

...