В версиях ниже 12c Oracle DBMS_JOB
и / или DBMS_SCHEDULER
будет планировать выполнение хранимой процедуры. Он может создать файл, но для этого вам потребуется пакет UTL_FILE
, а не SPOOL
.
Поскольку вы работаете в Oracle 12c, его DBMS_SCHEDULER
теперь предлагает новый тип задания - SQL_SCRIPT
, который позволяет планировать сценарий .SQL. Это означает, что код, который вы разместили, должен быть сохранен в виде файла. Я не могу создать пример на своем 11gXE, но вот ссылка на сайт ORACLE-BASE : https://oracle-base.com/articles/12c/scheduler-enhancements-12cr1 [ 119] и скопированный из него скрипт, который показывает, как это сделать:
CONN test/test@pdb1
-- Create a job with a SQL*Plus script defined in-line,
-- including an explicit connect.
SET SERVEROUTPUT ON
DECLARE
l_job_name VARCHAR2(30);
l_script VARCHAR2(32767);
BEGIN
l_job_name := DBMS_SCHEDULER.generate_job_name;
DBMS_OUTPUT.put_line('JOB_NAME=' || l_job_name);
-- Notice the explicit database connection in the script.
l_script := 'CONN test/test@pdb1
SPOOL /tmp/test.lst
SELECT SYSDATE, USER FROM dual;
SPOOL OFF';
DBMS_SCHEDULER.create_job(
job_name => l_job_name,
job_type => 'SQL_SCRIPT',
job_action => l_script,
credential_name => 'oracle_ol6_121',
enabled => TRUE
);
END;
/
В качестве альтернативы, вы можете использовать программу планирования вашей операционной системы (Task Scheduler в MS Windows) и сказать ей запускать скрипт .BAT, который установит соединение SQL * Plus и запустит скрипт .SQL, который содержит команду SPOOL
и оператор SELECT
.
Забыл сказать: я бы не стал вовлекать в это SQL Developer.
Вам нужно будет использовать либо цикл, либо понимание списка / генератора. Если вы хотите использовать все ключи и значения в нижнем регистре, вы можете сделать это ::
dict((k.lower(), v.lower()) for k,v in {'My Key':'My Value'}.iteritems())
Если вы хотите использовать только ключи только в нижнем регистре, вы можете сделать это ::
dict((k.lower(), v) for k,v in {'My Key':'My Value'}.iteritems())
Выражения генератора (использованные выше) часто полезны в создании словарей; Я использую их все время. Вся выразительность понимания цикла без лишних затрат памяти.
Нижеследующее идентично ответу Рика Копеланда, написанному без использования выражения генератора:
outdict = {}
for k, v in {'My Key': 'My Value'}.iteritems():
outdict[k.lower()] = v.lower()
Выражения-генераторы, Понимание списков и (в Python 2.7 и более поздних версиях) - это в основном способы переписывания циклов.
В Python 2.7+ вы можете использовать словарное понимание (это одна строка кода, но вы можете переформатировать их, чтобы сделать его более понятным). readable):
{k.lower():v.lower()
for k, v in
{'My Key': 'My Value'}.items()
}
Они довольно часто более аккуратны, чем эквивалент цикла, так как вам не нужно инициализировать пустой dict / list / etc ... но, если вам нужно сделать что-то большее, чем один вызов функции / метода, они может быстро стать грязным.