Динамическая буферизация в имя файла

Я хотел бы извлекать один и тот же запрос каждую неделю в sqlplus или SQLCL, возможно, планируя задачу на сервере Windows, буферизируя файл csv с именем кода учетной записи и датой. Я написал следующий скрипт, и он работает, но у меня есть две проблемы.

SET ECHO OFF
SET FEEDBACK OFF
SET VERIFY OFF
COL VPATH NEW_VALUE NEW_VPATH;
COL PRESIDIO NEW_VALUE NEW_PRESIDIO;
COL SEPARATORE NEW_VALUE NEW_SEPARATORE;
COL DATA NEW_VALUE NEW_DATA;
COL EXT NEW_VALUE NEW_EXT;
SET SQLFORMAT CSV;
SELECT 'C:\Shared_Folder\' VPATH, 'AO_GALLARATE' PRESIDIO,'_' SEPARATORE, TO_CHAR(CURRENT_DATE) DATA,'.CSV' EXT FROM DUAL;
SET FEEDBACK ON;
SET TERMOUT OFF;
SPOOL "&NEW_VPATH&NEW_PRESIDIO&NEW_SEPARATORE&NEW_DATA&NEW_EXT";
SELECT /*CSV*/ SERIAL_NUMBER, DNS_HOST_NAME, IP_ADDRESS, MODEL_NAME, TOTAL_PAGE_COUNT - COLOR_PAGE_COUNT, COLOR_PAGE_COUNT, TRUNC(LAST_DATA_COLLECTION) FROM DEVICE WHERE ACCOUNT_CODE = '&NEW_PRESIDIO' AND model_name LIKE '%MS410%';
ORDER BY SERIAL_NUMBER ASC;
SPOOL OFF;
  1. я получаю подсказку с просьбой ввести значение для всех new_vpath, new_presidio.. по крайней мере, в первый раз. Если я удалю эту часть, я получу запрос, когда он должен начать буферизацию
  2. Если я использую pl/sql, я могу успешно установить переменные, поэтому приглашение не появляется, но буферизация и запрос не работают. на самом деле буферизация говорит о недопустимом имени файла, и запрос не работает из-за отсутствующей строки «account_code» в запросе.

Где и что я делаю не так?


person Francesco Cicciuzz    schedule 29.03.2016    source источник


Ответы (1)


Наверное, ничего. Это немного отличается от того, что говорит @ruudvan, это дубликат. Вы должны иметь возможность использовать подстановку в команде spool так, как вы это делаете.

Это была ошибка в более ранней версии. В последней версии SQLcl я пробовал это и, похоже, отлично работает.

(~/qa) $cat subnew.sql
SET ECHO  OFF
SET FEEDBACK OFF
SET VERIFY OFF
COL VPATH NEW_VALUE NEW_VPATH;
COL PRESIDIO NEW_VALUE NEW_PRESIDIO;
COL SEPARATORE NEW_VALUE NEW_SEPARATORE;
COL DATA NEW_VALUE NEW_DATA;
COL EXT NEW_VALUE NEW_EXT;
COL USER NEW_VALUE NEW_USER;
SET SQLFORMAT CSV;
SELECT './' VPATH, 'AO_GALLARATE' PRESIDIO,'_' SEPARATORE, TO_CHAR(CURRENT_DATE) DATA,
       '.CSV' EXT , USER FROM DUAL;
SET FEEDBACK OFF;
SET TERMOUT OFF;
SPOOL "&NEW_VPATH&NEW_PRESIDIO&NEW_SEPARATORE&NEW_DATA&NEW_EXT";
select /* csv */ * from substitution
where upper(name) = '&NEW_USER';
SPOOL OFF;
exit

(~/qa) $sql barry/oracle @subnew

SQLcl: Release 12.2.0.1.0 RC on Tue Aug 09 13:21:28 2016

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Last Successful login time: Tue Aug 09 2016 13:21:29 +01:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

"VPATH","PRESIDIO","SEPARATORE","DATA","EXT","USER"
"./","AO_GALLARATE","_","09-AUG-16",".CSV","BARRY"
(~/qa) $ls -altr AO_GALLARATE_09-AUG-16.CSV 
-rw-r--r--  1 bamcgill  staff  22  9 Aug 13:21 AO_GALLARATE_09-AUG-16.CSV
(~/qa) $cat AO_GALLARATE_09-AUG-16.CSV 
"ID","NAME"
1,"Barry"
(~/qa) $
person Barry McGillin    schedule 09.08.2016