Ну, кто ещё не слышал, для тех новость: попробовать APEX 4.0 можно уже сейчас - http://tryapexnow.com/.
Всем приятного тестирования!
Читать далее
Coalesce SQ bug
неделю назад
drop table test_merge;
create table test_merge as select 1 m, 2 n from dual;
alter table test_merge add constraint test_merge_chk check (m <= n);
update test_merge set n = m - 1;
rollback;
select * from test_merge;
merge into test_merge tgt
using (select m, m-1 n from test_merge) src
on (tgt.m = src.m)
when matched then update set tgt.n = src.n;
commit;
select * from test_merge;
Таблица создана.
Таблица изменена.
update test_merge set n = m - 1
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(XXX.TEST_MERGE_CHK)
Откат завершен.
M N
---------- ----------
1 2
1 строка объединена.
Фиксация обновлений завершена.
M N
---------- ----------
1 0
merge into test_merge tgt
using (select m, m-1 n from test_merge) src
on (tgt.m = src.m)
when matched then update set tgt.n = src.n
when not matched then insert (m) values(null) where 1 = 0;
CREATE TABLE tmp(ID NUMBER PRIMARY KEY, d DATE);
declare
d date;
BEGIN
INSERT INTO tmp VALUES(1, to_date('01.12.1900', 'dd.mm.yyyy'));
INSERT INTO tmp VALUES(2, to_date('01.12.-1900', 'dd.mm.syyyy'));
dbms_stats.convert_raw_value(hextoraw('7764057f7f77aa'), d);
INSERT INTO tmp VALUES(3, d);
dbms_stats.convert_raw_value(hextoraw('F7640d01010101'), d);
INSERT INTO tmp VALUES(4, d);
COMMIT;
end;/
Номер байта слева - Компонент
в функции DUMP
1 - столетие + 100
2 - год в столетии + 100
3 - месяц
4 - день
5 - час + 1
6 - минута + 1
7 - секунда + 1
WITH t AS
(SELECT id, DUMP(d) AS dmp
FROM tmp),
comps as
(SELECT id, dmp
, substr(dmp, instr(dmp, ':', 1, 1)+1, instr(dmp, ',', 1, 1) - instr(dmp, ':') - 1) - 100 cc
, substr(dmp, instr(dmp, ',', 1, 1)+1, instr(dmp, ',', 1, 2) - instr(dmp, ',', 1, 1) - 1) - 100 yy
, substr(dmp, instr(dmp, ',', 1, 2)+1, instr(dmp, ',', 1, 3) - instr(dmp, ',', 1, 2) - 1) mm
, substr(dmp, instr(dmp, ',', 1, 3)+1, instr(dmp, ',', 1, 4) - instr(dmp, ',', 1, 3) - 1) dd
, substr(dmp, instr(dmp, ',', 1, 4)+1, instr(dmp, ',', 1, 5) - instr(dmp, ',', 1, 4) - 1) - 1 hh
, substr(dmp, instr(dmp, ',', 1, 5)+1, instr(dmp, ',', 1, 6) - instr(dmp, ',', 1, 5) - 1) - 1 mi
, substr(dmp, instr(dmp, ',', 1, 6)+1) - 1 ss
from t)
select id, dmp from comps
where cc not between -47 and 99
or (yy not between -99 and 99 or (cc = -47 and yy < -12))
or mm not between 1 and 12
or (mm in (1, 3, 5, 7, 8, 10, 12) and dd not between 1 and 31)
or (mm in (4, 6, 9, 11) and dd not between 1 and 30)
or ((mod(cc, 4) = 0 or (mod(cc, 4) <> 0 and mod(yy, 4) = 0)) and mm = 2 and dd not between 1 and 29)
or (mod(cc, 4) <> 0 and mod(yy, 4) <> 0 and mm = 2 and dd not between 1 and 28)
or hh not between 0 and 23
or mi not between 0 and 59
or ss not between 0 and 59;
create or replace function IsDateValid(aDate varchar2, aFormat varchar2) return int
is
d date;
begin
d := to_date(aDate, aFormat);
return 1;
exception
when others then
if sqlcode between -1899 and -1800 then
return 0;
else
raise;
end if;
end IsDateValid;
/
WITH t AS
(SELECT id, DUMP(d) AS dmp
FROM tmp),
comps as
(SELECT id, dmp
, substr(dmp, instr(dmp, ':', 1, 1)+1, instr(dmp, ',', 1, 1) - instr(dmp, ':') - 1) - 100 cc
, substr(dmp, instr(dmp, ',', 1, 1)+1, instr(dmp, ',', 1, 2) - instr(dmp, ',', 1, 1) - 1) - 100 yy
, substr(dmp, instr(dmp, ',', 1, 2)+1, instr(dmp, ',', 1, 3) - instr(dmp, ',', 1, 2) - 1) mm
, substr(dmp, instr(dmp, ',', 1, 3)+1, instr(dmp, ',', 1, 4) - instr(dmp, ',', 1, 3) - 1) dd
, substr(dmp, instr(dmp, ',', 1, 4)+1, instr(dmp, ',', 1, 5) - instr(dmp, ',', 1, 4) - 1) - 1 hh
, substr(dmp, instr(dmp, ',', 1, 5)+1, instr(dmp, ',', 1, 6) - instr(dmp, ',', 1, 5) - 1) - 1 mi
, substr(dmp, instr(dmp, ',', 1, 6)+1) - 1 ss
from t)
select id, dmp
from comps
where IsDateValid( to_char(dd, '900.')||to_char(mm, '900.')||to_char(cc*100+yy, '90000')||to_char(hh, '900')||':'||to_char(mi, '900')||':'||to_char(ss, '900')
, 'DD.MM.SYYYY HH24:MI:SS') = 0;
create or replace function IsDateDumpValid(p_date date)
return integer
is
l_date_str varchar2(32);
l_try_date date;
begin
select to_char(dd, '900.')||to_char(mm, '900.')||to_char(cc*100+yy, '90000')||to_char(hh, '900')||':'||to_char(mi, '900')||':'||to_char(ss, '900')
into l_date_str
from (SELECT substr(dmp, instr(dmp, ':', 1, 1)+1, instr(dmp, ',', 1, 1) - instr(dmp, ':') - 1) - 100 cc
, substr(dmp, instr(dmp, ',', 1, 1)+1, instr(dmp, ',', 1, 2) - instr(dmp, ',', 1, 1) - 1) - 100 yy
, substr(dmp, instr(dmp, ',', 1, 2)+1, instr(dmp, ',', 1, 3) - instr(dmp, ',', 1, 2) - 1) mm
, substr(dmp, instr(dmp, ',', 1, 3)+1, instr(dmp, ',', 1, 4) - instr(dmp, ',', 1, 3) - 1) dd
, substr(dmp, instr(dmp, ',', 1, 4)+1, instr(dmp, ',', 1, 5) - instr(dmp, ',', 1, 4) - 1) - 1 hh
, substr(dmp, instr(dmp, ',', 1, 5)+1, instr(dmp, ',', 1, 6) - instr(dmp, ',', 1, 5) - 1) - 1 mi
, substr(dmp, instr(dmp, ',', 1, 6)+1) - 1 ss
from (select dump(p_date) dmp from dual) t) comps;
begin
l_try_date := to_date(l_date_str, 'DD.MM.SYYYY HH24:MI:SS');
return 1;
exception
when others then
if sqlcode between -1899 and -1800 then
return 0;
else
raise;
end if;
end;
end;
/
select id from tmp where IsDateDumpValid(d) = 0;
select id from tmp
where d <> d + numtodsinterval(trunc(1e8/3),'second') - numtodsinterval(trunc(1e8/3),'second');
/* Сохранить в сессии значение элемента асинхронно */
function saveThisItemAsync(p){
/* создаём пустой вызов к БД - без имени процесса и callback-функции */
var aget = new apex.ajax.ondemand();
/* добавляем нашу переменную-элемент */
aget.ajax.add(p.id, $v(p));
aget._get();
}
/* Сохранить в сессии значение элемента */
function saveThisItem(p){
var get = new apex.ajax.ondemand();
get.ajax.add(p.id, $v(p));
get.ajax.get();
}
apex.ajax = {
...
ondemand : function (pWidget,pReturn){
var that = this;
this.ajax = new htmldb_Get(null,$x('pFlowId').value,'APPLICATION_PROCESS='+pWidget,0);
this._get = _get;
this._set = _set;
this._return = !!pReturn?pReturn:_return;
return;
function _get(pValue){
that.ajax.GetAsync(that._return);
}
function _set(pValue){}
function _return(pValue){}
}
}
<script type='text/javascript' src="http://path/to/jquery" /> <link href='http://path/to/SyntaxHighlighter/styles/shCore.css' rel='stylesheet' type='text/css'/> <link href='http://path/to/SyntaxHighlighter/styles/shThemeRDark.css' rel='stylesheet' type='text/css'/> <script src='http://path/to/SyntaxHighlighter/scripts/shCore.js' type='text/javascript'/> <script src='http://path/to/SyntaxHighlighter/scripts/shBrushBash.js' type='text/javascript'/> <script src='http://path/to/SyntaxHighlighter/scripts/shBrushJScript.js' type='text/javascript'/> <script src='http://path/to/SyntaxHighlighter/scripts/shBrushXml.js' type='text/javascript'/> <script src='http://path/to/SyntaxHighlighter/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://www.google.com/jsapi' type='text/javascript'/> <script type='text/javascript'> google.load('jquery', '1');</script> <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/> <link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeRDark.css' rel='stylesheet' type='text/css'/> <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/> <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/> <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/> <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/> <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
$(document).ready( function runSyntaxHighlighter(){ SyntaxHighlighter.config.bloggerMode = true; SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf'; SyntaxHighlighter.all(); } );
<pre class="brush: brushName">ваш код</pre>
<a href="javascript:passBack('');">Это строка с ключом NULL</a>
select 'Это строка с ключом NULL' d, null r from dual union all
FUNCTION f_lov_null(p_item_name IN VARCHAR2) Return VARCHAR2 IS
BEGIN
IF v(p_item_name) = 'undefined' THEN
Return(NULL);
ELSE
return(v(p_item_name));
END IF;
END;
nullif(lower(v('YOUR_ITEM_NAME')), 'undefined')
<script type="text/javascript">
var get;
function doIt(){
get = new htmldb_Get(null, $v('pFlowId'),null,N /*Номер страницы с нужным содержимым*/ );
get.GetAsync(f_AsyncReturn);
};
function f_AsyncReturn(){
if (p.readyState==4) {
/*Присваиваем текст ответа нашей переменной get*/
get.response = p.responseText;
/*Присваиваем содержимому нужного элемента часть ответа между двух тегов*/
$x('RESULT_REGION').innerHTML=get.getPartial("", "");
get = null;
}
}
</script>
/*В функцию добавлены параметры - регион и страница, которую запрашиваем*/
/*Кроме того, я добавил параметры тегов, с которого и по который считывать страницу*/
function doIt(frame, page, from_tag, to_tag){
var get;
get = new htmldb_Get(null, $v('pFlowId'),null,page);
get.p = get.GetAsync(function(){f_AsyncReturn(get, frame, from_tag, to_tag)});
};
function f_AsyncReturn(get, frame, from_tag, to_tag){
if (get.p && get.p.readyState==4) {
get.response = get.p.responseText;
$x(frame).innerHTML = get.getPartial(from_tag, to_tag);
get = null;
}
}
<head>
<title>Edit Page Template</title>
<link type="image/x-icon" href="/i/favicon.ico" rel="icon"/>
<link type="image/x-icon" href="/i/favicon.ico" rel="shortcut icon"/>
<script type="text/javascript" src="/i/javascript/apex_ns_3_1.js"></script>
<script type="text/javascript" src="/i/javascript/apex_3_1.js"></script>
<script type="text/javascript" src="/i/javascript/apex_get_3_1.js"></script>
<script type="text/javascript" src="/i/javascript/apex_builder.js"></script>
<script type="text/javascript"></script>
<link type="text/css" href="/i/css/apex_3_1.css" rel="stylesheet"></link>
<script type="text/javascript"></script>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link type="text/css" href="/i/css/apex_builder_3_1.css" rel="stylesheet"></link>
<!-- То, что хочу подключить -->
</head>
1G_PAGE_HTML_HEAD:
1<link rel="stylesheet" href=":
1css/apex_3_1.css" type="text/css" /><!--[if IE]><link rel="stylesheet" href=":
1css/apex_ie_3_1.css" type="text/css" /><![endif]--><script src=":
1javascript/apex_ns_3_1.js" type="text/javascript"></script><script src=":
1javascript/apex_3_1.js" type="text/javascript"></script><script src=":
1javascript/apex_get_3_1.js" type="text/javascript"></script>:
user@system$> sudo apt-get update
user@system$> sudo apt-get install build-essential autoconf automake \
bison flex gtk-sharp2-gapi boo gdb valac libfontconfig1-dev \
libcairo2-dev libpango1.0-dev libfreetype6-dev libexif-dev \
libjpeg62-dev libtiff4-dev libgif-dev zlib1g-dev libatk1.0-dev \
libglib2.0-dev libgtk2.0-dev libglade2-dev libart-2.0-dev \
libgnomevfs2-dev libgnome-desktop-dev libgnome2-dev libgnomecanvas2-dev \
libgnomeui-dev libgnomeprint2.2-dev libgnomeprintui2.2-dev \
libpanel-applet2-dev libnautilus-burn-dev librsvg2-dev \
libgtkhtml3.14-dev libgtksourceview2.0-dev libgtksourceview-dev \
libvte-dev libwnck-dev libnspr4-dev libnss3-dev libxul-dev \
libwebkit-dev libvala-dev
user@system$> mkdir -p src/mono-2.4; cd src/mono-2.4
user@system$> cat > mono-2.4-environment[Нажмите Ctrl+D, чтобы закончить файл]
#!/bin/bash
MONO_PREFIX=/opt/mono-2.4
GNOME_PREFIX=/opt/gnome-2.4
export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH
export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$MONO_PREFIX/include:$GNOME_PREFIX/include
export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal
export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig:$GNOME_PREFIX/lib/pkgconfig
PATH=$MONO_PREFIX/bin:$PATH
PS1="[mono-2.4] \w @ "
user@system$> sudo mv mono-2.4-environment /usr/local/binИ создадим второй скрипт, который будет загружать окружение и выполнять переданные аргументы.
user@system$> sudo chmod +x /usr/local/bin/mono-2.4-environment
user@system$> cat > mono-2.4[Нажмите Ctrl+D, чтобы закончить файл]
#!/bin/bash
MONO_PREFIX=/opt/mono-2.4
GNOME_PREFIX=/opt/gnome-2.4
export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH
export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$MONO_PREFIX/include:$GNOME_PREFIX/include
export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal
export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig:$GNOME_PREFIX/lib/pkgconfig
PATH=$MONO_PREFIX/bin:$PATH
exec "$@"
user@system$> sudo mv mono-2.4 /usr/local/binЗагрузите окружение:
user@system$> sudo chmod +x /usr/local/bin/mono-2.4
user@system$> source mono-2.4-environmentПосле этого пользовательское приглашение в консоли изменится на [mono-2.4], показывая, что Вы работаете в окружении Mono 2.4.
[mono-2.4] ~ @ cd ~/src/mono-2.4Прим.пер.: дальше автор обращает внимание на то, что до конца установки мы будем работать в этом окружении, но пользовательское приглашение он будет писать старое -
user@system$>
; в переводе всё так же.user@system$> sudo mkdir -p /opt/mono-2.4
user@system$> cd libgdiplus-2.4Скрипт configure должен вывести что-то вроде такого:
user@system$> ./configure --prefix=/opt/mono-2.4 --with-pango
---Если по какой-нибудь опции будет стоять "no" ("нет"), тогда у Вас отсутствует что-то зависимое. Вы можете использовать Synaptic, чтобы найти соответствующий пакет для установки. Тем не менее, эти зависимости не обязательны. (Прим. пер.: хотите — устанавливайте, хотите — нет.)
Configuration summary
* Installation prefix = /opt/mono-2.4
* Cairo = 1.8.0 (system)
* Text = pango
* EXIF tags = yes
* Codecs supported:
- TIFF: yes
- JPEG: yes
- GIF: yes
- PNG: yes
NOTE: if any of the above say 'no' you may install the
corresponding development packages for them, rerun
autogen.sh to include them in the build.
---
user@system$> make
user@system$> sudo make install
user@system$> cd ../mono-2.4Проверим, что компиляторы mono установились:
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> which gmcsДолжно вывести: /opt/mono-2.4/bin/gmcs.
user@system$> cd ../gtk-sharp-2.12.8
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../gnome-sharp-2.20.1
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../gnome-desktop-sharp-2.20.1
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../gluezilla-2.4
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../gecko-sharp-2.0-0.13
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../webkit-sharp-0.2
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../mono-addins-0.4
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../mono-tools-2.4Этим Вы установили утилиту gsharp. Проверьте:
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> gsharpНемного поиграйтесь с командами на C#. :) Введите quit;, когда закончите.
user@system$> cd ../xsp-2.4
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../mono-debugger-2.4
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../monodevelop-2.0И... Это всё. У Вас теперь есть работающее окружение mono-2.4 и превосходная среда разработки для работы с ним.
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../monodevelop-debugger-mdb-2.0
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../monodevelop-debugger-gdb-2.0
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../monodevelop-database-2.0
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../monodevelop-java-2.0
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> cd ../monodevelop-vala-2.0
user@system$> ./configure --prefix=/opt/mono-2.4
user@system$> make
user@system$> sudo make install
user@system$> mono-2.4 PATH_TO_THE_PROGRAM_AND_ITS_ARGUMENTS_IF_ANYЗАМЕЧАНИЕ! Это будет работать только для shell-скриптов, которые обычно идут вместе с mono-приложениями. Если Вы заглянете в /opt/mono-2.4/bin/monodevelop, то увидите, что это просто shell-скрипт, который, в сущности, выполняет что-то вроде: mono /opt/mono-2.4/lib/monodevelop/bin/MonoDevelop.exe. Попытка запустить .NET-приложение, например main.exe, просто набрав mono-2.4 main.exe, выдаст ошибку. Взамен Вам стоит писать mono-2.4 mono main.exe.
$ gpg --keyserver keyserver.name --recv-key 1234567890ABCDEF && gpg -a --export 1234567890ABCDEF | sudo apt-key add -
pgpkeys.mit.edu
keys.niif.hu
mono-2.4 monodevelop
запускает ожидаемый MonoDevelop.sudo make install
. Придётся завтра (ну, то есть уже сегодня) всё переустанавливать sudo checkinstall
...Recently I was writing here about Oracle Database, Oracle APEX, Linux. Now I'm more interested in PostgreSQL and AWS, but Oracle will always be in my heart. :) suPPLer