динамические сценарии создания оракула - PullRequest
0 голосов
/ 23 мая 2018

у меня есть таблица t1 с именами базовых таблиц и именами их столбцов.Я хочу создать сценарий для каждой таблицы с заголовком столбца, разделенным разделителем канала.

create table t1 (table_nm varchar2(10) , col_nm varchar2(20));

  INSERT INTO T1  SELECT 'AAA' , 'FNAME' FROM DUAL UNION ALL
                         SELECT 'AAA' , 'LNAME' FROM DUAL UNION ALL
                         SELECT 'AAA' , 'PH_NO' FROM DUAL UNION ALL
                         SELECT 'BBB' , 'LAST_NM' FROM DUAL UNION ALL
                         SELECT 'BBB' , 'EMAIL' FROM DUAL ;
  COMMIT;

код, который я пытаюсь.

 SELECT * FROM
    (
    WITH ABC AS (SELECT TABLE_NM, RTRIM(XMLAGG(XMLELEMENT(E,COL_NM,'|').EXTRACT('//text()') ORDER BY COL_NM).GETCLOBVAL(),'|') AS COL 
    from t1 group by table_nm)
     select
      'set termout off '||chr(10)|| 
      'set timing off '||chr(10)||
      'set echo off '||chr(10)||
      'set feedback off '||chr(10)||
      'set linesize 104 '||chr(10)||
      'set pagesize 0 '||CHR(10)||
      'spool /tmp/'||abc.TABLE_NM||'.csv '||CHR(10)||
      'SELECT '||''''||COL||''''||' FROM DUAL;'||CHR(30)||
      'select '||COL||' from '||abc.table_nm||';'||chr(10)||
      'spool off' EXTRACT
      FROM ABC
      );

ошибок, которые я получаю с фактическими данными.

1) ORA-00996: оператор конкатенации ||, не |

ожидаемые файлы / вывод

 AAA.dat
 FNAME|LNAME|PH_NO
 .... some values with pipe delimiter
 ...

 BBB.dat
 LAST_NM|EMAIL
 some values with pipe delimiter

Не могли бы вы помочь мне в этом.

Я изменил вопрос и удалил первую проблему.да, мне не нужно ||на последнем .. я также изменил в запросеПосле выполнения приведенного выше кода в SQL-разработчике я получаю вывод наподобие

"set termout off 
set timing off 
set echo off 
set feedback off 
set linesize 104 
set pagesize 0 
spool /tmp/AAA.dat
SELECT 'FNAME|LNAME|PH_NO' FROM DUAL;
SELECT  FNAME|LNAME|PH_NO FROM AAA;
spool off"   

, второй оператор выбора выдает ошибку как:

 SELECT  FNAME|LNAME|PH_NO FROM AAA;
 ORA-00996: the concatenate operator is ||, not |
00996. 00000 -  "the concatenate operator is ||, not |" 

Есть ли другой подход для обработки этого

1 Ответ

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

Во втором сгенерированном запросе используется неправильный оператор конкатенации (| вместо ||):

SELECT  FNAME|LNAME|PH_NO FROM AAA;

Поскольку вам нужно включить сам разделитель в вывод, вам необходимопревращается во что-то вроде:

SELECT  FNAME || '|' || LNAME || '|' || PH_NO FROM AAA;

. Для этого вы можете заменить символ разделителя (|) строкой конкатенации (||'|'||).Вам также нужно будет экранировать одинарные кавычки в строковом литерале здесь (||''|''||).

Вы можете сделать это непосредственно в запросе генерации:

...
'select '|| REPLACE(COL, '|', '||''|''||') ||' from '||abc.table_nm||';'||chr(10)||
...

Весь запрос после обновления:

SELECT * FROM
(
WITH ABC AS (SELECT TABLE_NM, RTRIM(XMLAGG(XMLELEMENT(E,COL_NM,'|').EXTRACT('//text()') ORDER BY COL_NM).GETCLOBVAL(),'|') AS COL 
from t1 group by table_nm)
 select
  'set termout off '||chr(10)|| 
  'set timing off '||chr(10)||
  'set echo off '||chr(10)||
  'set feedback off '||chr(10)||
  'set linesize 104 '||chr(10)||
  'set pagesize 0 '||CHR(10)||
  'spool /tmp/'||abc.TABLE_NM||'.csv '||CHR(10)||
  'SELECT '||''''||COL||''''||' FROM DUAL;'||CHR(30)||
  'select '||REPLACE(COL, '|', '||''|''||')||' from '||abc.table_nm||';'||chr(10)||
  'spool off' EXTRACT
  FROM ABC
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...