2014-09-19
2014-08-04
FND_STANDARD_DATE
Если мы хотим передавать параметр даты из OEBS при вызове concurrent, то
1. Объявляет переменную типа FND_STANDARD_DATE или FND_STANDARD_DATETIME
2. В значении по-умолчанию можно указать такую штуку:
1. Объявляет переменную типа FND_STANDARD_DATE или FND_STANDARD_DATETIME
2. В значении по-умолчанию можно указать такую штуку:
-- Формат даты и даты-времени зависит от настроек в OEBS
select fnd_date.date_to_displaydate(SYSDATE) from dual;
-- 04-АВГ-2014
select fnd_date.date_to_displaydt(SYSDATE) from dual;
-- 04-АВГ-2014 15:28:28
select fnd_date.date_to_chardate(SYSDATE) from dual;
-- 04-АВГ-2014
select fnd_date.date_to_chardt(SYSDATE) from dual;
-- 04-АВГ-2014 15:28:28
функции ...date даты без времени, функции ...dt дата со временем
3. В pl/sql-процедуре переменная типа varchar2, которая преобразуется к дате с помощью функции
PROCEDURE p(
...
, p_dt VARCHAR2
...
) IS
l_dt DATE;
BEGIN
l_dt := fnd_date.canonical_to_date(p_dt);
Каким бы мы способом не отображали дату в значениях по умолчанию, передеается она в canonical
2014-08-01
Git кишками наружу
По-моему просто отличный комментарий про git с хабра.
Я активно пользуюсь git в своей профессиональной деятельности и тем не менее считаю, что он слишком сложный. Это, выражаясь по-английски, худший experience среди всех средств вэб-разработки, которыми я когда либо пользовался.Совершенно точно передана мысль про то, что не add-commit-push, то смертушка. Пока не попались утилиты (хотя особо и не искал), в которых можно было бы удобно сделать тоже, что так удобно делалоь в Tortoise
И да, я постоянно боюсь, что я что-нибудь сломаю. Потому что с git я постоянно что-нибудь ломаю. Шаг вправо/шаг влево от типового workflow «add-commit-push», и все, капец. Сиди гугли, консультируйся на git@freenode и бей в бубен. Авось починишь.
Чаще, чем хотелось бы, оказывался в ситуации, когда переделать работу заново было проще, чем восстанавливать покалеченное состояние репозитория.
Все локальные копии проектов держу в Dropbox с проплаченной функцией истории правок, чтобы можно было откатить проект (ну и, в первую очередь, состояние локального репозитория), не заморачиваясь с созданием резервных копий вручную.
А все потому, что git сделан кишками наружу. Если провести аналогию со стиральной машиной, то у git на переднюю панель выведены не кнопки «деликатная стирка», «отжим» и т. п., а «нагреть спираль», «подать воду», «раскрутить барабан» и далее в таком духе. И любое неверное действие заставляет вас горько жалеть, что вы — домохозяйка. Включил нагрев, забыв подать воду, — сжег одежду. Открыл крышку, забыв слить воду, — затопил соседей.
Или представьте, что git — это автомобиль. В случае с любым другим автомобилем, вы можете быть высокопрофессиональным водителем и при этом не иметь никакого представления, что у автомобиля под капотом. Но только не с git! C git вы должны быть матерым автослесарем, способным с завязанными глазами перебрать карбюратор, чтобы водить эту машину. В противном случае недостаточное знание git приведет к тому, что во время езды он вас катапультирует на ровном месте — но ведь любой уважающий себя автослесарь знает, что нельзя втыкать зарядку в прикуриватель в то мгновение, когда «стреляют» свечи зажигания.
Сейчас набегут гуру программироавния и объяснят, что я лох и не умею пользоваться инструментом (ну и карму сольют, куда без этого). Так вот, отвечу, что во всем мире вэб-разработки нет другой такой программы, как git. Все остальные утилиты нормальные (с другими VCS не сравниваю, опыта нет). Из неадекватных инструментов можно вспомнить разве что vi, который во времена, когда в мобильниках не было интернета, не оставил мне, оздаченному школьнику, вариантов, кроме как перезагрузить комп. Но vi по сравнению с git, как говорится, курит в сторонке.
Спасибо-пожалуйста.
2014-06-06
dbms_scheduler
Краткие выводы:
1. Commit не только не нужен, но и делается внутри run_job
2. Если мы хотим сохдать job, который будет запускаться без лишних телодвижений, то в create_job надо указывать enabled => true
3. Если мы не указали enabled = true, то job можно запустить руками, но при этом user_scheduler_jobs.run_count не инкрементируется. Если enabled = true, то инкрементируется и при запуске руками
4. Удобно задавать интервалы запуска не через даты (хотя это тоже возможно), а через выражения, например 'FREQ=MINUTELY;INTERVAL=2'
5. Если job занимает больше времени, чем интервал, то он будет выполняться постоянно, причем в таблице user_scheduler_jobs дата следующего запуска была меньше даты последнего
6. Дата следующего запуска отсчитывается от даты начала предыдущего, а не от конца
7. max_failures можно установить только через set_attribute. Если он NULL, то джоб никогда не ломается.
Код
1. Commit не только не нужен, но и делается внутри run_job
2. Если мы хотим сохдать job, который будет запускаться без лишних телодвижений, то в create_job надо указывать enabled => true
3. Если мы не указали enabled = true, то job можно запустить руками, но при этом user_scheduler_jobs.run_count не инкрементируется. Если enabled = true, то инкрементируется и при запуске руками
4. Удобно задавать интервалы запуска не через даты (хотя это тоже возможно), а через выражения, например 'FREQ=MINUTELY;INTERVAL=2'
5. Если job занимает больше времени, чем интервал, то он будет выполняться постоянно, причем в таблице user_scheduler_jobs дата следующего запуска была меньше даты последнего
6. Дата следующего запуска отсчитывается от даты начала предыдущего, а не от конца
7. max_failures можно установить только через set_attribute. Если он NULL, то джоб никогда не ломается.
Код
CREATE TABLE job_test(a NUMBER PRIMARY KEY, dt DATE DEFAULT SYSDATE);
create SEQUENCE job_test_seq;
-- 1. Джоб выполняем 1 раз.
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'PLSQL_BLOCK',
job_action => 'insert into job_test(a) values(job_test_seq.nextval);'
);
END;
/
BEGIN
insert into job_test(a) values(-2);
dbms_scheduler.run_job(job_name => 'a_job', use_current_session => TRUE);
END;
/
-- Вывод Commit не только не нужен, но и делает его явно, вне зависимости от второго параметра
-- 2. Джоб выполняем раз в минуту, час, день
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'PLSQL_BLOCK',
job_action => 'insert into job_test(a) values(job_test_seq.nextval);',
repeat_interval => 'FREQ=MINUTELY', /*"YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" | "HOURLY" | "MINUTELY" | "SECONDLY"*/
ENABLED => TRUE
);
END;
/
-- надо указывать enabled=true, иначе не запустится
-- Без enabled запускается только руками, причем в user_scheduler_jobs запуск руками в колонке RUN_COUNT не отражается
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'PLSQL_BLOCK',
job_action => 'insert into job_test(a) values(job_test_seq.nextval);',
start_date => SYSDATE + 1/24/60,
repeat_interval => 'FREQ=MINUTELY' /*"YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" | "HOURLY" | "MINUTELY" | "SECONDLY"*/
);
END;
/
BEGIN
dbms_scheduler.run_job(job_name => 'a_job', use_current_session => TRUE);
END;
/
-- А так и run_count будет инкрементироваться
BEGIN
dbms_scheduler.enable(name => 'a_job');
END;
/
-- А как запускать каждые 2 минуты через интервал
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'PLSQL_BLOCK',
job_action => 'insert into job_test(a) values(job_test_seq.nextval);',
repeat_interval => 'FREQ=MINUTELY;INTERVAL=2', /*"YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" | "HOURLY" | "MINUTELY" | "SECONDLY"*/
ENABLED => TRUE
);
END;
/
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'PLSQL_BLOCK',
job_action => 'dbms_lock.sleep(10); insert into job_test(a) values(job_test_seq.nextval);',
repeat_interval => 'FREQ=SECONDLY;INTERVAL=3', /*"YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" | "HOURLY" | "MINUTELY" | "SECONDLY"*/
ENABLED => TRUE
);
END;
/
-- Прибавляется ли дата к концу
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'PLSQL_BLOCK',
job_action => 'dbms_lock.sleep(10); insert into job_test(a) values(job_test_seq.nextval);',
repeat_interval => 'FREQ=MINUTELY', /*"YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" | "HOURLY" | "MINUTELY" | "SECONDLY"*/
ENABLED => TRUE
);
END;
/
-- Вывод - дата отсчитывается от начала запуска
-- max_failures
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'PLSQL_BLOCK',
job_action => 'insert into job_test(a) values(1);',
repeat_interval => 'FREQ=secondly', /*"YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" | "HOURLY" | "MINUTELY" | "SECONDLY"*/
ENABLED => TRUE
);
END;
/
-- по-умолчанию выполняется вечность
-- попробуем поставить
-- Делается только через set_attribute
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'PLSQL_BLOCK',
job_action => 'insert into job_test(a) values(1);',
repeat_interval => 'FREQ=secondly', /*"YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY" | "HOURLY" | "MINUTELY" | "SECONDLY"*/
ENABLED => TRUE
);
dbms_scheduler.set_attribute(name => 'a_job', attribute => 'max_failures', value => 100);
END;
/
--Можно ли процедуру засунуть в пакет для типа STORED_PROCEDURE
create or replace package tst_job is
PROCEDURE tst_job;
end tst_job;
/
create or replace package body tst_job is
PROCEDURE tst_job IS
BEGIN
insert into job_test(a) values(job_test_seq.nextval);
END;
end tst_job;
/
BEGIN
dbms_scheduler.create_job(job_name => 'a_job',
job_type => 'STORED_PROCEDURE',
job_action => 'sps.tst_job.tst_job',
ENABLED => TRUE
, auto_drop => FALSE
);
END;
/
-- Важно -- указать auto_drop = false, иначе, без указания интервала и start_time, процедура выполняется 1 раз и сразу удаляется
TRUNCATE TABLE job_test;
BEGIN
dbms_scheduler.drop_job('a_job');
END;
/
SELECT * FROM user_scheduler_jobs;
2014-05-16
Тормозит Android emulator
1. Установить Intel® Hardware Accelerated Execution Manager
2. Установить Intel Atom System image в Android SDK

3. Создать Device в котором использовать процессор Intel
2. Установить Intel Atom System image в Android SDK
3. Создать Device в котором использовать процессор Intel
Подписаться на:
Сообщения (Atom)