<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8754905534249595707</id><updated>2012-01-27T18:15:17.950+01:00</updated><category term='tools'/><category term='triggers'/><category term='history'/><title type='text'>ORA-0815</title><subtitle type='html'>This is about Oracle SQL development and may sometimes even cover DBA topics.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ora-0815.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ora-0815.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>robert</name><uri>http://www.blogger.com/profile/01724179181550310220</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8754905534249595707.post-2063055169845056191</id><published>2009-06-10T09:27:00.006+02:00</published><updated>2009-06-10T09:37:24.420+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>SQL Developer Update - What?</title><content type='html'>Today I used the update feature of &lt;a href="http://www.oracle.com/technology/products/database/sql_developer/index.html"&gt;SQL Developer&lt;/a&gt; (version 1.5.3).  After stepping on (there were no errors) I saw this summary screen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qtXgbQKZZJw/Si9hjq0KNUI/AAAAAAAAAAU/jxf7eqnAxws/s1600-h/sql-developer-wtf.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_qtXgbQKZZJw/Si9hjq0KNUI/AAAAAAAAAAU/jxf7eqnAxws/s400/sql-developer-wtf.png" border="0" alt="SQL Developer Update Summary Screen" id="BLOGGER_PHOTO_ID_5345598548128445762" /&gt;&lt;/a&gt;&lt;br /&gt;Looks like someone forgot to fill their data model properly... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8754905534249595707-2063055169845056191?l=ora-0815.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ora-0815.blogspot.com/feeds/2063055169845056191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ora-0815.blogspot.com/2009/06/sql-developer-update-what.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default/2063055169845056191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default/2063055169845056191'/><link rel='alternate' type='text/html' href='http://ora-0815.blogspot.com/2009/06/sql-developer-update-what.html' title='SQL Developer Update - What?'/><author><name>robert</name><uri>http://www.blogger.com/profile/01724179181550310220</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qtXgbQKZZJw/Si9hjq0KNUI/AAAAAAAAAAU/jxf7eqnAxws/s72-c/sql-developer-wtf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8754905534249595707.post-7424409233567551162</id><published>2009-02-23T16:59:00.009+01:00</published><updated>2009-02-23T17:49:19.642+01:00</updated><title type='text'>Scoping of Functions in PL/SQL Packages</title><content type='html'>There was this &lt;a href="http://groups.google.de/group/comp.databases.oracle.misc/browse_frm/thread/8f3bdaf62507ca9c#"&gt;recent&lt;br /&gt;discussion on comp.databases.oracle.misc&lt;/a&gt; about scoping of functions in PL/SQL.&lt;br /&gt;I have set up a test script that you can send through SQL Plus.  The script is here:&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;spool C:\Temp\pkg-test.txt&lt;br /&gt;set echo on pagesize 100 linesize 150 serverout on&lt;br /&gt;create package call_test&lt;br /&gt;as&lt;br /&gt;function f_pub(x in number) return number;&lt;br /&gt;procedure p_pub_direct;&lt;br /&gt;procedure p_pub_direct_qualified;&lt;br /&gt;procedure p_pub_immediate;&lt;br /&gt;procedure p_pub_immediate_qualified;&lt;br /&gt;procedure p_priv_direct;&lt;br /&gt;procedure p_priv_immediate;&lt;br /&gt;procedure p_priv_immediate_qualified;&lt;br /&gt;procedure p_priv_var_direct;&lt;br /&gt;procedure p_priv_var_immediate;&lt;br /&gt;end call_test;&lt;br /&gt;/&lt;br /&gt;show errors package call_test&lt;br /&gt;create package body call_test&lt;br /&gt;as&lt;br /&gt;&lt;br /&gt;function f_pub(x in number) return number&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;  return x * 10;&lt;br /&gt;end f_pub;&lt;br /&gt;&lt;br /&gt;function f_priv(x in number) return number&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;  return x * 20;&lt;br /&gt;end f_priv;&lt;br /&gt;&lt;br /&gt;procedure p_pub_direct&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('direct call of public function');&lt;br /&gt;  for c in ( select f_pub(2) as num from dual ) loop&lt;br /&gt;    dbms_output.put_line('value ' || c.num);&lt;br /&gt;  end loop;&lt;br /&gt;end p_pub_direct;&lt;br /&gt;&lt;br /&gt;procedure p_pub_direct_qualified&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('direct call of public function using qualified name');&lt;br /&gt;  for c in ( select call_test.f_pub(2) as num from dual ) loop&lt;br /&gt;    dbms_output.put_line('value ' || c.num);&lt;br /&gt;  end loop;&lt;br /&gt;end p_pub_direct_qualified;&lt;br /&gt;&lt;br /&gt;procedure p_pub_immediate&lt;br /&gt;as&lt;br /&gt;  tmp number;&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('execute immediate with public function');&lt;br /&gt;  execute immediate 'select f_pub(2) as num from dual' into tmp;&lt;br /&gt;  dbms_output.put_line('value ' || tmp);&lt;br /&gt;end p_pub_immediate;&lt;br /&gt;&lt;br /&gt;procedure p_pub_immediate_qualified&lt;br /&gt;as&lt;br /&gt;  tmp number;&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('execute immediate with public function using qualified name');&lt;br /&gt;  execute immediate 'select call_test.f_pub(2) as num from dual' into tmp;&lt;br /&gt;  dbms_output.put_line('value ' || tmp);&lt;br /&gt;end p_pub_immediate_qualified;&lt;br /&gt;&lt;br /&gt;procedure p_priv_direct&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('direct call of private function');&lt;br /&gt;  dbms_output.put_line('this will not compile');&lt;br /&gt;  /*&lt;br /&gt;  for c in ( select f_priv(2) as num from dual ) loop&lt;br /&gt;    dbms_output.put_line('value ' || c.num);&lt;br /&gt;  end loop;&lt;br /&gt;  for c in ( select call_test.f_priv(2) as num from dual ) loop&lt;br /&gt;    dbms_output.put_line('value ' || c.num);&lt;br /&gt;  end loop;&lt;br /&gt;  */&lt;br /&gt;end p_priv_direct;&lt;br /&gt;&lt;br /&gt;procedure p_priv_immediate&lt;br /&gt;as&lt;br /&gt;  tmp number;&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('execute immediate with private function');&lt;br /&gt;  execute immediate 'select f_priv(2) as num from dual' into tmp;&lt;br /&gt;  dbms_output.put_line('value ' || tmp);&lt;br /&gt;end p_priv_immediate;&lt;br /&gt;&lt;br /&gt;procedure p_priv_immediate_qualified&lt;br /&gt;as&lt;br /&gt;  tmp number;&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('execute immediate with private function using qualified name');&lt;br /&gt;  execute immediate 'select call_test.f_priv(2) as num from dual' into tmp;&lt;br /&gt;  dbms_output.put_line('value ' || tmp);&lt;br /&gt;end p_priv_immediate_qualified;&lt;br /&gt;&lt;br /&gt;procedure p_priv_var_direct&lt;br /&gt;as&lt;br /&gt;  foo number := 123;&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('direct call with private variable');&lt;br /&gt;  for c in ( select foo as num from dual ) loop&lt;br /&gt;    dbms_output.put_line('value ' || c.num);&lt;br /&gt;  end loop;&lt;br /&gt;end p_priv_var_direct;&lt;br /&gt;&lt;br /&gt;procedure p_priv_var_immediate&lt;br /&gt;as&lt;br /&gt;  tmp number;&lt;br /&gt;  foo number := 123;&lt;br /&gt;begin&lt;br /&gt;  dbms_output.put_line('execute immediate with private variable');&lt;br /&gt;  execute immediate 'select foo as num from dual' into tmp;&lt;br /&gt;  dbms_output.put_line('value ' || tmp);&lt;br /&gt;end p_priv_var_immediate;&lt;br /&gt;&lt;br /&gt;end call_test;&lt;br /&gt;/&lt;br /&gt;show errors package body call_test&lt;br /&gt;set echo off&lt;br /&gt;show release&lt;br /&gt;exec call_test.p_pub_direct;&lt;br /&gt;exec call_test.p_pub_direct_qualified;&lt;br /&gt;exec call_test.p_pub_immediate;&lt;br /&gt;exec call_test.p_pub_immediate_qualified;&lt;br /&gt;exec call_test.p_priv_direct;&lt;br /&gt;exec call_test.p_priv_immediate;&lt;br /&gt;exec call_test.p_priv_immediate_qualified;&lt;br /&gt;exec call_test.p_priv_var_direct;&lt;br /&gt;exec call_test.p_priv_var_immediate;&lt;br /&gt;drop package call_test&lt;br /&gt;/&lt;br /&gt;spool off&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And here's how output looks from a 10.2.0.4 on Linux&lt;br /&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;release 1002000400&lt;br /&gt;direct call of public function&lt;br /&gt;value 20&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;direct call of public function using qualified name&lt;br /&gt;value 20&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;execute immediate with public function&lt;br /&gt;BEGIN call_test.p_pub_immediate; END;&lt;br /&gt;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-00904: "F_PUB": invalid identifier&lt;br /&gt;ORA-06512: at "RK.CALL_TEST", line 39&lt;br /&gt;ORA-06512: at line 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;execute immediate with public function using qualified name&lt;br /&gt;value 20&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;direct call of private function&lt;br /&gt;this will not compile&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;execute immediate with private function&lt;br /&gt;BEGIN call_test.p_priv_immediate; END;&lt;br /&gt;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-00904: "F_PRIV": invalid identifier&lt;br /&gt;ORA-06512: at "RK.CALL_TEST", line 72&lt;br /&gt;ORA-06512: at line 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;execute immediate with private function using qualified name&lt;br /&gt;BEGIN call_test.p_priv_immediate_qualified; END;&lt;br /&gt;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-00904: "CALL_TEST"."F_PRIV": invalid identifier&lt;br /&gt;ORA-06512: at "RK.CALL_TEST", line 81&lt;br /&gt;ORA-06512: at line 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;direct call with private variable&lt;br /&gt;value 123&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;execute immediate with private variable&lt;br /&gt;BEGIN call_test.p_priv_var_immediate; END;&lt;br /&gt;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-00904: "FOO": invalid identifier&lt;br /&gt;ORA-06512: at "RK.CALL_TEST", line 101&lt;br /&gt;ORA-06512: at line 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I do not find these results surprising at all:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;You are never allowed to use a package private function in a SELECT because the SQL engine does not see package private items.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When using EXECUTE IMMEDIATE this is like a call to a global function which cannot know anything about the package context, hence you need to use a qualified name.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8754905534249595707-7424409233567551162?l=ora-0815.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ora-0815.blogspot.com/feeds/7424409233567551162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ora-0815.blogspot.com/2009/02/scoping-of-functions-in-plsql-packages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default/7424409233567551162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default/7424409233567551162'/><link rel='alternate' type='text/html' href='http://ora-0815.blogspot.com/2009/02/scoping-of-functions-in-plsql-packages.html' title='Scoping of Functions in PL/SQL Packages'/><author><name>robert</name><uri>http://www.blogger.com/profile/01724179181550310220</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8754905534249595707.post-7217043067697800372</id><published>2009-01-28T13:04:00.015+01:00</published><updated>2009-02-05T13:45:21.753+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='triggers'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>Table History - with a Twist</title><content type='html'>&lt;h2&gt;The Task&lt;/h2&gt;The other day colleagues wanted to track changes of rows in a table. They wanted to fill a history table which contains all the columns from the original table plus a timestamp. You would immediately think "triggers". Well yes, but with INSERT and UPDATE triggers you would get an entry &lt;span style="font-style: italic;"&gt;per change&lt;/span&gt; while colleagues wanted an entry &lt;span style="font-style: italic;"&gt;per transaction&lt;/span&gt; only. This makes matters slightly more complicated.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;First Solution?&lt;/h2&gt;I thought, this is easy: just record changes in a package variable and then write them to the history table on COMMIT. Of course, you need INSERT and UPDATE triggers - and a COMMIT trigger. It turns out, while you will &lt;a href="http://www.google.com/search?q=oracle+%22commit+trigger%22"&gt;find plenty&lt;/a&gt; on the matter the beast simply &lt;a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2064177"&gt;does not exist&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Final Solution!&lt;/h2&gt;Well the solution is not that far away. Ingredients are&lt;br /&gt;&lt;ol&gt;&lt;li&gt;a history table sharing the original table's columns plus a TIMESTAMP column but without primary key,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;INSERT and UPDATE triggers,&lt;/li&gt;&lt;li&gt;a global temporary table,&lt;/li&gt;&lt;li&gt;ROWID.&lt;/li&gt;&lt;/ol&gt; Now stir thoroughly and everything falls into place. The final solution works like this: when the fist change of a record in the original table appears in a transaction a history record is created in the history table and the ROWID of it is stored in the global temporary table.  For all subsequent changes of the same record (identified by its primary key) the history record is looked up via the global temporary table and then updated.  That way no more than one history record is created per transaction per original record.  When the transaction terminates (either via COMMIT or ROLLBACK) the global temporary table is cleared.&lt;br /&gt;&lt;br /&gt;Here is a script that you can execute in SQL Plus and which will demonstrate how this works.  You can concatenate all three parts and put them in a single file for execution with SQL Plus.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Setup:&lt;/h3&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI.SS.FF3';&lt;br /&gt;prompt "---------- START ---------- "&lt;br /&gt;column ts format a30&lt;br /&gt;set feedback on&lt;br /&gt;set serveroutput on&lt;br /&gt;&lt;br /&gt;create sequence s1&lt;br /&gt;start with 1 increment by 1 cache 20&lt;br /&gt;/&lt;br /&gt;create table t1 (&lt;br /&gt;  id number(10) primary key,&lt;br /&gt;  name1 varchar2(15 char),&lt;br /&gt;  name2 varchar2(15 char)&lt;br /&gt;)&lt;br /&gt;/&lt;br /&gt;create table t1_hist (&lt;br /&gt;  ts timestamp(3) not null,&lt;br /&gt;  id number(10),&lt;br /&gt;  name1 varchar2(15 char),&lt;br /&gt;  name2 varchar2(15 char),&lt;br /&gt;  constraint pk2 primary key ( id, ts ) using index compress 1&lt;br /&gt;)&lt;br /&gt;/&lt;br /&gt;create global temporary table t1_hist_ptr (&lt;br /&gt;  id number(10) primary key,&lt;br /&gt;  rid rowid not null            -- we use rowid for efficient row access&lt;br /&gt;)&lt;br /&gt;on commit delete rows&lt;br /&gt;/&lt;br /&gt;create trigger t1_insert&lt;br /&gt;after insert or update of id, name1, name2&lt;br /&gt;on t1&lt;br /&gt;for each row&lt;br /&gt;declare&lt;br /&gt;  rid rowid;&lt;br /&gt;begin&lt;br /&gt;  if updating and :new.id &amp;lt;&amp;gt; :old.id then&lt;br /&gt;    -- PK has changed!&lt;br /&gt;    update t1_hist_ptr set&lt;br /&gt;      id = :new.id&lt;br /&gt;    where id = :old.id;&lt;br /&gt;&lt;br /&gt;    dbms_output.put_line('===&amp;gt; updated id ' || :old.id || ' -&amp;gt; ' || :new.id );&lt;br /&gt;  end if;&lt;br /&gt;&lt;br /&gt;  update t1_hist set&lt;br /&gt;    ts    = systimestamp,&lt;br /&gt;    id    = :new.id, -- important!&lt;br /&gt;    name1 = :new.name1,&lt;br /&gt;    name2 = :new.name2&lt;br /&gt;  where t1_hist.rowid = ( select rid from t1_hist_ptr where id = :new.id );&lt;br /&gt;&lt;br /&gt;  dbms_output.put_line('===&amp;gt; updated rowcount ' || sql%rowcount);&lt;br /&gt;&lt;br /&gt;  if sql%rowcount = 0 then&lt;br /&gt;    -- not there yet, need to insert history record&lt;br /&gt;    insert into t1_hist values ( systimestamp, :new.id, :new.name1, :new.name2 )&lt;br /&gt;      returning rowid into rid;&lt;br /&gt;    insert into t1_hist_ptr values ( :new.id, rid );&lt;br /&gt;  end if;&lt;br /&gt;end t1_insert;&lt;br /&gt;/&lt;br /&gt;show errors trigger t1_insert&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Update tests:&lt;/h3&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;/*&lt;br /&gt; * MAIN START&lt;br /&gt; */&lt;br /&gt;-- initially empty&lt;br /&gt;select t1_hist.*&lt;br /&gt;from t1_hist&lt;br /&gt;order by t1_hist.ts, t1_hist.id&lt;br /&gt;/&lt;br /&gt;-- inserts&lt;br /&gt;set echo on&lt;br /&gt;insert into t1 values ( s1.nextval, '1 original', 'bar' )&lt;br /&gt;/&lt;br /&gt;insert into t1 values ( s1.nextval, '2 original', 'buz' )&lt;br /&gt;/&lt;br /&gt;set echo off&lt;br /&gt;select t1_hist.*&lt;br /&gt;from t1_hist&lt;br /&gt;order by t1_hist.ts, t1_hist.id&lt;br /&gt;/&lt;br /&gt;-- update&lt;br /&gt;set echo on&lt;br /&gt;update t1 set name1 = '1 updated 1' where id = 1&lt;br /&gt;/&lt;br /&gt;set echo on&lt;br /&gt;update t1 set name1 = '1 updated 2' where id = 1&lt;br /&gt;/&lt;br /&gt;set echo off&lt;br /&gt;select t1_hist.*&lt;br /&gt;from t1_hist&lt;br /&gt;order by t1_hist.ts, t1_hist.id&lt;br /&gt;/&lt;br /&gt;commit&lt;br /&gt;/&lt;br /&gt;-- update with rollback&lt;br /&gt;set echo on&lt;br /&gt;update t1 set name1 = '2 updated 3' where id = 2&lt;br /&gt;/&lt;br /&gt;set echo off&lt;br /&gt;select t1_hist.*&lt;br /&gt;from t1_hist&lt;br /&gt;order by t1_hist.ts, t1_hist.id&lt;br /&gt;/&lt;br /&gt;rollback&lt;br /&gt;/&lt;br /&gt;select t1_hist.*&lt;br /&gt;from t1_hist&lt;br /&gt;order by t1_hist.ts, t1_hist.id&lt;br /&gt;/&lt;br /&gt;-- insert with dummy id&lt;br /&gt;insert into t1 values ( -1, '-1 original', 'dummy entry' )&lt;br /&gt;/&lt;br /&gt;update t1 set id = s1.nextval where id = -1&lt;br /&gt;/&lt;br /&gt;commit&lt;br /&gt;/&lt;br /&gt;select t1_hist.*&lt;br /&gt;from t1_hist&lt;br /&gt;order by t1_hist.ts, t1_hist.id&lt;br /&gt;/&lt;br /&gt;/*&lt;br /&gt; * MAIN END&lt;br /&gt; */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Cleanup:&lt;/h3&gt;&lt;pre class="brush: sql"&gt;&lt;br /&gt;drop table t1_hist_ptr&lt;br /&gt;/&lt;br /&gt;drop table t1_hist&lt;br /&gt;/&lt;br /&gt;drop table t1&lt;br /&gt;/&lt;br /&gt;drop sequence s1&lt;br /&gt;/&lt;br /&gt;prompt "---------- END ----------"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8754905534249595707-7217043067697800372?l=ora-0815.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ora-0815.blogspot.com/feeds/7217043067697800372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ora-0815.blogspot.com/2009/01/table-history-with-twist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default/7217043067697800372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default/7217043067697800372'/><link rel='alternate' type='text/html' href='http://ora-0815.blogspot.com/2009/01/table-history-with-twist.html' title='Table History - with a Twist'/><author><name>robert</name><uri>http://www.blogger.com/profile/01724179181550310220</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8754905534249595707.post-5933480493505379452</id><published>2009-01-28T11:52:00.001+01:00</published><updated>2009-01-28T12:53:57.941+01:00</updated><title type='text'>Welcome!</title><content type='html'>I am a senior software engineer doing a lot of things (sometimes I even think too many at a time). Among these are Java application development and improvement, database development and maintenance as well as investigation of performance issues in Oracle databases.&lt;br /&gt;&lt;br /&gt;In case you wonder what error ORA-0815 is - it does not exist as far as I know. The phrase "08/15" seems to be mostly used in German speaking countries. It originated from a machine gun model and means something like "ordinary" or "cheap". See the &lt;a href="http://de.wikipedia.org/wiki/08/15_%28Redewendung%29"&gt;German Wikipedia&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;In this blog I will try to present Oracle related stuff that I believe is interesting to others. The focus will be on SQL development and improvement and not so much about DBA topics. Please do not expect too much as my writing time resources are limited. If you find anything helpful I would be glad. Enjoy!&lt;br /&gt;&lt;br /&gt;robert&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8754905534249595707-5933480493505379452?l=ora-0815.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ora-0815.blogspot.com/feeds/5933480493505379452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ora-0815.blogspot.com/2009/01/welcome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default/5933480493505379452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8754905534249595707/posts/default/5933480493505379452'/><link rel='alternate' type='text/html' href='http://ora-0815.blogspot.com/2009/01/welcome.html' title='Welcome!'/><author><name>robert</name><uri>http://www.blogger.com/profile/01724179181550310220</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
