BEREGNING AF DANSKE HELLIGDAGE OUGDK ORACLE8 GIS (GEEKY INTERNAL STUFF): PHYSICAL DATA STORAGE INTERNALS



Relaterede dokumenter
Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

Project Step 7. Behavioral modeling of a dual ported register set. 1/8/ L11 Project Step 5 Copyright Joanne DeGroat, ECE, OSU 1

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

Privat-, statslig- eller regional institution m.v. Andet Added Bekaempelsesudfoerende: string No Label: Bekæmpelsesudførende

Aktivering af Survey funktionalitet

DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Index

Black Jack --- Review. Spring 2012

how to save excel as pdf

Help / Hjælp

The X Factor. Målgruppe. Læringsmål. Introduktion til læreren klasse & ungdomsuddannelser Engelskundervisningen

User Manual for LTC IGNOU

Userguide. NN Markedsdata. for. Microsoft Dynamics CRM v. 1.0

E-PAD Bluetooth hængelås E-PAD Bluetooth padlock E-PAD Bluetooth Vorhängeschloss

Shooting tethered med Canon EOS-D i Capture One Pro. Shooting tethered i Capture One Pro 6.4 & 7.0 på MAC OS-X & 10.8

Hvor er mine runde hjørner?

Basic statistics for experimental medical researchers

PARALLELIZATION OF ATTILA SIMULATOR WITH OPENMP MIGUEL ÁNGEL MARTÍNEZ DEL AMOR MINIPROJECT OF TDT24 NTNU

Trolling Master Bornholm 2015

Boligsøgning / Search for accommodation!

Resource types R 1 1, R 2 2,..., R m CPU cycles, memory space, files, I/O devices Each resource type R i has W i instances.

Sortering fra A-Z. Henrik Dorf Chefkonsulent SAS Institute

How Long Is an Hour? Family Note HOME LINK 8 2

Vores mange brugere på musskema.dk er rigtig gode til at komme med kvalificerede ønsker og behov.

CHAPTER 8: USING OBJECTS

WIKI & Lady Avenue New B2B shop

Brug sømbrættet til at lave sjove figurer. Lav fx: Få de andre til at gætte, hvad du har lavet. Use the nail board to make funny shapes.

Engelsk. Niveau C. De Merkantile Erhvervsuddannelser September Casebaseret eksamen. og

Vejledning til Sundhedsprocenten og Sundhedstjek

Bilag. Resume. Side 1 af 12

The River Underground, Additional Work

LESSON NOTES Extensive Reading in Danish for Intermediate Learners #8 How to Interview

QUICK START Updated: 18. Febr. 2014

Trolling Master Bornholm 2013

QUICK START Updated:

Database. lv/

Engelsk. Niveau D. De Merkantile Erhvervsuddannelser September Casebaseret eksamen. og

Trolling Master Bornholm 2016 Nyhedsbrev nr. 8

Bookingmuligheder for professionelle brugere i Dansehallerne

Financial Literacy among 5-7 years old children

RoE timestamp and presentation time in past

Trolling Master Bornholm 2012

Skriftlig Eksamen Diskret matematik med anvendelser (DM72)

Vina Nguyen HSSP July 13, 2008

GUIDE TIL BREVSKRIVNING

Unitel EDI MT940 June Based on: SWIFT Standards - Category 9 MT940 Customer Statement Message (January 2004)

Status på det trådløse netværk

Det er muligt at chekce følgende opg. i CodeJudge: og

Sport for the elderly

CS 4390/5387 SOFTWARE V&V LECTURE 5 BLACK-BOX TESTING - 2

Blomsten er rød (af Harry Chapin, oversat af Niels Hausgaard)

Kalkulation: Hvordan fungerer tal? Jan Mouritsen, professor Institut for Produktion og Erhvervsøkonomi

Backup Applikation. Microsoft Dynamics C5 Version Sikkerhedskopiering

From innovation to market

MSE PRESENTATION 2. Presented by Srunokshi.Kaniyur.Prema. Neelakantan Major Professor Dr. Torben Amtoft

Skriftlig Eksamen Kombinatorik, Sandsynlighed og Randomiserede Algoritmer (DM528)

Trolling Master Bornholm 2016 Nyhedsbrev nr. 7

ECE 551: Digital System * Design & Synthesis Lecture Set 5

Trolling Master Bornholm 2016 Nyhedsbrev nr. 6

Design til digitale kommunikationsplatforme-f2013

WIFI koder til Miljøagenturet: Brugernavn: AIACE course Kodeord: TsEG2pVL EU LOGIN KURSUS 21. AUGUST FORMIDDAG:

Danish Language Course for International University Students Copenhagen, 12 July 1 August Application form

Trolling Master Bornholm 2016 Nyhedsbrev nr. 5

United Nations Secretariat Procurement Division

Danish Language Course for Foreign University Students Copenhagen, 13 July 2 August 2016 Advanced, medium and beginner s level.

3D NASAL VISTA 2.0

SAS Corporate Program Website

IPTV Box (MAG250/254) Bruger Manual

SEPA Direct Debit. Mandat Vejledning Nets Lautrupbjerg 10 DK-2750 Ballerup

Trolling Master Bornholm 2016 Nyhedsbrev nr. 3

Improving data services by creating a question database. Nanna Floor Clausen Danish Data Archives

Mandara. PebbleCreek. Tradition Series. 1,884 sq. ft robson.com. Exterior Design A. Exterior Design B.

Trolling Master Bornholm 2014

En Kort Introduktion til Oracle

Oracle PL/SQL. Overview of PL/SQL

Fejlbeskeder i SMDB. Business Rules Fejlbesked Kommentar. Validate Business Rules. Request- ValidateRequestRegist ration (Rules :1)

Before you begin...2. Part 1: Document Setup...3. Part 2: Master Pages Part 3: Page Numbering...5. Part 4: Texts and Frames...

On the complexity of drawing trees nicely: corrigendum

extreme Programming Kunders og udvikleres menneskerettigheder

Linear Programming ١ C H A P T E R 2

Nyhedsmail, december 2013 (scroll down for English version)

TM4 Central Station. User Manual / brugervejledning K2070-EU. Tel Fax

Terese B. Thomsen 1.semester Formidling, projektarbejde og webdesign ITU DMD d. 02/

DK - Quick Text Translation. HEYYER Net Promoter System Magento extension

Martin Lohse. Passing. Three mobile for accordion. Composed

Microsoft Dynamics C5. version 2012 Service Pack 01 Hot fix Fix list - Payroll

3D NASAL VISTA TEMPORAL

Online kursus: Content Mangement System - Wordpress

Overfør fritvalgskonto til pension

Appendix 1: Interview guide Maria og Kristian Lundgaard-Karlshøj, Ausumgaard

Besvarelser til Lineær Algebra Reeksamen Februar 2017

University of Copenhagen Faculty of Science Written Exam - 3. April Algebra 3

Tema: Pets Fag: Engelsk Målgruppe: 4. klasse Titel: Me and my pet Vejledning Lærer

IBM Software Group. SOA v akciji. Srečko Janjić WebSphere Business Integration technical presales IBM Software Group, CEMA / SEA IBM Corporation

Side 1 af 9. SEPA Direct Debit Betalingsaftaler Vejledning

ATEX direktivet. Vedligeholdelse af ATEX certifikater mv. Steen Christensen

1 What is the connection between Lee Harvey Oswald and Russia? Write down three facts from his file.

Exploring Subversive Eclipse SVN Team Provider

Velkommen. Backup & Snapshot v. Jørgen Weinreich / Arrow ECS Technical Specialist

Skriftlig Eksamen Beregnelighed (DM517)

Freefly B-Række Regler

Transkript:

Juni 2001 Nr 6, Årgang 2 ISSN 1600-5147 Pris: kr. 125,00 ex moms www.oracleekspert.dk #6 OUGDK DBA SIG Dato for næste møde er endnu ikke fastlagt. Designer SIG Næste møde: juni 2001 Developer SIG Dato for næste møde er endnu ikke fastlagt. Data warehouse SIG Dato for næste møde er endnu ikke fastlagt. Web SIG Gruppen er lukket ned indtil en ny koordinator er fundet. NYHEDER Oracle databasen er #1 til CRM FastForward Mobile Email and Corporate Directory Nato implementerer E-Business Suite Microsoft går efter Oracle og Sun Langsomt salg de næste 2-3 kvartaler Ellison peger på efterfølger.now overhaler.net Oracle #1 i sikkerheds-certificering Oracle annoncerer idevelop2001 Online SAP og Yahoo går sammen om at udvikle portal software eweek bekræfter at ias9i giver øget performance Ellison får forbud mod at lande jetjager Oracle vil bygge digitalt hospital 2. generation af New Internet Computer Oracle vil fyre 2% af medarbejderne BEREGNING AF DANSKE HELLIGDAGE Danske helligdage er ikke noget man beregner. Dem slå man op i en tabel. Eller gør man? Ta årskalenderen fra sekretæren! Her får du en PL/SQL løsning, som beregner dem. Til og med væsentligt hurtigere end de kan SELECT es fra en tabel. Anders Frandsen ORACLE8 GIS (GEEKY INTERNAL STUFF): PHYSICAL DATA STORAGE INTERNALS This month, Dan will focus on some internals of the Oracle RDBMS, primarily physical storage of data. This article will concentrate on data blocks: how they re created, how space is really managed inside a tablespace, and some other geeky internal stuff of interest in the physical storage of data. Dan Hotka TOP-N QUERY At finde de 20 rækker fra en tabel med de største eller mindste værdier i en given kolonne har i mange år ikke været helt lige til. Denne artikel belyser hvorledes det alligevel kan klares med relativt enkle midler. Martin Jensen SIMULATING OPS$ USERS THROUGH A BROWSER If your business is running an intranet on an MS network, it is possible to authenticate MS users as Oracle users without prompting them for a second login name and password. Unfortunately, Oracle only supports this for client/server applications like Forms and Reports. This presentation will show you how to authenticate MS users running Web applications through a browser as well. Marc de Oliveira CUTTING CODE WITH STYLE PART II This article is part II of a two part series that explains a recommended coding style that is easy to write, read and maintain. This issue will focus on various structures of SQL and PL/SQL including SELECT, INSERT, IF and LOOPS. Scott Hollows

Leder BRUGERGRUPPENS EVOLUTION Marc de Oliveira, ansvarshavende redaktør. Trods en meget svær begyndelse er det nu lykkedes at udgive seks numre af Danmarks mindst ringe Oracle-tidsskrift. Dette har ikke kunnet lade sig gøre uden en masse frivilligt arbejde, villige annoncører, engagerede artikelforfattere og ikke mindst den støt voksende skare af abonnenter. OracleEkspert sendes nu ud til over 150 abonnenter i Danmark og enkelte andre europæiske lande! Specielt skal Miracle A/S, DBVision, ehuset, Quest Software og de 12 foredragsholdere takkes for deres store opbakning til OracleEkspert-konferencen, der blev afholdt den 26. april, som gjorde dagen til en stor oplevelse for alle os, der deltog. Ifølge deltagernes evaluering er ønsket om en gentagelse af konceptet enormt med en score på 91 (ud af 100). Bedømmelsen af indlæggenes indhold ligger også langt over middel med en score på 80%. Men selv om OracleEkspert-konferencen var en stor succes, så har bladet også fået mange knubs i løbet af sit første leveår. 150 abonnenter vidner om, en stor interesse for bladet. Det er dog alligevel ikke nok til at finansiere bladet, så vi har derfor været meget afhængige af annoncørernes velvilje til at betale en stor del af omkostningerne. Men som det også kan ses af de første seks numre, har annoncørerne ikke ligefrem stået i kø for at købe spalteplads. Så har dele af OUGDKs bestyrrelse langet ud efter bladet. Der har været kritik af, at navnet OUGDK blev placeret så centralt på forsiden, at det kunne give læsere den idé, at bladet var udgivet af brugergruppen. Kritikken handler også om at ved at bladet betaler for artiklerne er det blevet alt for svært for brugergruppen at få folk til at stille op til OUGDK-møderne uden betaling. Og endelig er vi blevet kritiseret for at have taget initiativ til Oracle- Ekspert-konferencen, fordi brugergruppen har været arrangør af en konference på færgen Sjælland for otte år siden. Også sidste nummers leder fremkaldte stærke reaktioner blandt læserne. Heldigvis kom der også positive tilbagemeldinger fra læsere, som var enige i, at virksomhederne vitterligt nedprioriterer deres faste medarbejder i forhold til hvad de er villige til at betale for konsulenter. Men vi fik også en stribe reaktioner fra konsulenter, som følte at artiklen var et angreb på dem og deres ret til at kræve den betaling, som virksomhederne var villige til at give. Det mest farverige udfald og den efterfølgende brevveksling er gengivet i forkortet version i debatkolonnen Svar. Oracle Danmark, som fra begyndelsen var en meget aktiv støtte for bladet via nyheder, annoncer, adresselister mv uden hvilke bladet aldrig kunne være blevet til noget, er efter Henrik Bustrups flytning til England, tilsyneladende blevet mindre venligt stemt overfor projektet. Selv Martin Jensens deltagelse i OracleEkspert-konferencen var truet. Som det kan ses af ovenstående, har det altså ikke blot været en dans på roser at få Danmarks mindst ringe Oracle-tidskrift på benene. Og det har ofte undret Deres ydmyge redaktør, at et initiativ som OracleEkspert har så svært ved at slå bredt igennem i Oracle-miljøet. OracleEkspert er blevet til for at støtte alt, hvad der har med Oracle at gøre. Primært skal alle os, som arbejder med Oracle, have styrket vores tekniske viden. Det er også bladets mål at formidle viden om, hvad der strategisk sker omkring selskabet Oracle, og hvad der bliver sagt om det i medierne. Det er også vigtig at alle, som udvikler Oracle-løsninger og udbyder Oracle-ydelser kan delagtiggøre Oracle-miljøet i hvad de kan gøre for os. OracleEkspert er også et godt sted at skabe en dialog med Oracle Danmark (eller USA for den sags skyld), hvor de er på udebane. Et sted, som ikke er kontrolleret af Oracle, hvor debatten mellem Oracle og Oracles brugere sker på lige fod. En sådan debat er i høj grad også i Oracles egen interesse. Endelig er OracleEkspert også et kald til at få OUGDK op af hullerne. Der er mange dygtige Oracle-brugere i Danmark, og de har lyst til at deltage i spændende udbytterige arrangementer. Med indkaldelsen til OUGDKs debatmøde om emnet den 31. maj er der åbnet mulighed for at brugergruppen kan evoluere til at blive en meget mere aktiv spiller i Oracle-miljøet. Det fortjener vi. Well, he hands you a nickel, he hands you a dime, He asks you with a grin if you're havin' a good time, Then he fines you every time you slam the door. I ain't gonna work for Maggie's brother no more. - Bob Dylan (fyldte 60 år i torsdags) Oplag:................250 kopier Udgives af:..............pythia Information...................Kongensvej 3..............2000 Frederiksberg.......................Danmark Telefon:................26279991 Fax:...................26199991 Email:......Info@OracleEkspert.dk Web:.......www.OracleEkspert.dk Ansvarshavende redaktør:.................marc de Oliveira...........Marc@OracleEkspert.dk Rettigheder: PYTHIA Information ejer alle rettigheder til indholdet af OracleEkspert. Kopiering af bladet i dele eller helhed må kun ske efter skriftligt samtykke fra PYTHIA Information. PYTHIA Information forbeholder sig rettigheder til at offentliggøre og genudgive de trykte artikler, tips mv, samt at tillade bladets læsere at anvende indholdet til såvel personlige som kommercielle formål. PYTHIA Information kan ikke drages til ansvar for eventuelle fejl og mangler i Indholdet af OracleEkspert. Artikler mv stilles tilrådighed uden garanti af nogen art. Pris: Enkeltnummer..........DKK 125,00 1 års abonnement.......dkk 600,00 Ved samtidig køb af minimum 5 kopier til samme adresse (enkeltnummer eller abonnement) gives 40% rabat på den samlede pris. Priserne er excl moms. Annoncer: Annoncer til OracleEkspert nr 6 skal være PYTHIA Information i hænde senest den 11. juli 2001. Annoncepriser kan findes på: www.oracleekspert.dk Password: nwaabiab

Mogens Nørgaard: Din leder i nr. 5 er - efter min mening - uden pointe eller konsekvens. Du latterliggører på den ene side konsulent-timepriserne som afsindigt, latterligt, høje. Øh - hvordan fanden kan de være det? Som gammel, halvstuderet stud.polit. må jeg jo tørt konstatere at udbud og efterspørgsel faktisk svarer bedst til hinanden i et marked med åben og megen konkurrence - og det har vi fan'me i IT-konsulentbranchen. Det er kort sagt efter min mening kompelt og fuldstændigt sludder og nonsens du giver udtryk for. Du glemmer den store, logiske konklusion (logisk efter min mening :) ): Folk tager ikke springet ud som selvstændige for at blive rige. Det er iøvrigt en pisse nedladende holdning at åbenbare overfor (alle) os, der har turdet at starte noget selv, hvis jeg skal blive helt direkte overfor dig. Folk tager springet fordi Karl Marx (omsider!) har fået ret: Menneskene bør og ønsker at eje produktionsmidlerne. Og det gør de idag - hvis de vil, og hvis de tør. For produktionsmidlerne er deres viden/hjerne. Læs mere i bogen Funky Business, hvis du skal have det uddybet. Folk vil ganske simpelt bare være deres egen herre. Sådan som mennesket altid har ønsket sig det.et eksempel: Når folk siger op i det offentlige er det da - bevar os - nogle gange pga. lønnen. Det kunne også tænkes at være pga. manglende muligheder. Eller manglende ledelse. Men de ting er - tror jeg - ikke den udslagsgivende faktor. Det er derimod den manglende evne hos iøvrigt skidegode og -ivrige ledere til at få beslutninger presset igennem systemet. Det er det, der reelt frustrerer folk mest idag. Og hvis folk er deres egen herre kan de helt bypasse det problem og simpelthen bare tage beslutningerne selv. En fed tendens, iøvrigt. Den får hyggeonklerne og "vi-ved-bedst"-socialdemokraterne til at stejle, men faktisk har folk det bedst med at bestemme over sig selv. Marc de Oliveira: Jeg vil give dig ret i at min leder ikke giver nogen færdig løsningsmodel på det problem, som den berører (jeg har også kun en halv side at brede mig på!), men alligevel synes jeg, at den når at synliggøre nogle væsentlige pointer i diskussionen om virksomhedernes holdning til hhv fastansatte og konsulenter, og det er det, som har været min pointe med lederen. Skriv til: Svar@OracleEkspert.dk Mit udtryk "uhyrlige beløb langt over 1000 kr" anvendes til at beskrive det misforhold der er mellem den fastansattes egen løn og den pris, som hans/- hendes arbejde faktisk kan sælges til. Læst i sammenhæng bruges udtrykket klart til at påvise, at den faste medarbejder får for lidt, frem for at konsulenten får for meget. Dette understreges også andre steder med sætninger om konsulenter som "at få den fulde andel af deres arbejdes værdi" og "[at virksomhederne] betaler den faktiske markedspris for dem". Selvfølgelig er den pris, man kan sælge sin vare for et udtryk for varens værdi. Det vil jeg på ingen måde anfægte, og det mener jeg heller ikke, at jeg på nogen måde gør i lederen. At sige, at jeg (personligt) er nedladende overfor konsulenter er absurd, da jeg jo netop foretager mig en række ting, som selvstændig. Desuden synes jeg da, at jeg har et rigtigt godt forhold til en lang række selvstændige. Jeg kan på alle måder forstå de bevæggrunde, der får folk til at vælge freelance-karrieren. Som du selv nævner, gør jeg selv opmærksom på fordelene ved at dele specialviden i et resourceknapt miljø. Det er bestemt ikke min hensigt at fornægte værdien (endog nødvendigheden) af at virksomheder deler specialiseret viden via konsulenter. Men den diskussion ligger udenfor lederens tema. Jeg forsøger ikke noget sted i lederen at sige noget om, hvorvidt højt specialiserede folk er mere værd end mindre specialiserede folk eller ej. Det jeg forsøger at gøre opmærksom på, er at den samme arbejdskraft kan sælges som konsulentydelse eller via fastansættelse, og at så vel virksomheder som lønmodtagere alt andet lige (pris og kvalitet), ville have mere glæde af hinanden ved at have en mere fast tilknytning til hinanden. Jeg angiver netop også "mere selvbestemmelse og større frihed til at vælge deres arbejdsopgaver" som grunde til at blive freelance. Som allerede nævnt går min kritik på virksomhedernes dispositioner og slet ikke mod de folk, der enten vælger fastansættelsen eller freelance-livet. Mogens Nørgaard: OK, jeg læste det også som eet af dine forslag, at virksomhederne skulle bruge pengene på deres medarbejdere fremfor på konsulenter. Det kan man jo ikke være uenig i, for det ville jo åbenlyst være smartere. Men realiteterne er, at vi og vores branche (og sgu' sikkert også vores samfund) er på vej helt væk fra de store enheder og hierakier og hen mod en tilstand, hvor individet tager ansvaret for sig selv og sit liv i langt højere grad (på godt og ondt). Trenden har jo været der i 10 år i USA. Dem, der kan klare sig, laver næsten alle sammen noget selvstændigt virksomhedshalløj. Det er den tendens ("Marx fik ret"), der er virkeligheden, og den egentlige årsag til at folk søger væk (tror jeg). Ikke pengene eller ITudfordringerne. Derfor er det forkerte ting du sætter op mod hinanden. Rent økonomisk aner jeg efterhånden ikke, hvad en virksomhed burde foretrække. Der kan virkelig siges for og imod. Men man kan ikke sige Svar Fortsætter på side 14

Tools Teknisk Artikel BEREGNING AF DANSKE HELLIGDAGE Af Anders Frandsen. Anders arbejder som freelance konsulent for ZofteX ApS. Han har over 10 års erfaring med Oracle, primært med C (OCI), Oracle 7 / 8, SQL, PL/SQL og Forms. Han kan kontaktes på Anders.Frandsen@ZofteX.dk Hvorfor beregne? Alternativet til beregning, er kalenderopslag, typisk via en tabel. Den løsning indebærer 3 ting, jeg hader: 1. Vedligeholdelse (indtastning af næste års helligdage) 2. Mulighed for fejlindtastning 3. Datalogisk klamp! Alligevel er tabelopslag den eneste løsning, jeg har oplevet i Oracle-verden. Uanset om der skal beregnes bankdage eller fridage altid opslag i en tabel. Her følger mit bud på en beregningsløsning. Problemet Problemet opstod da man (Mayland s grundlæggere?) besluttede, at placeringen af Skærtorsdag, Langfredag og alle de andre uregelmæssigt faldende helligdage, skulle afhænge af placeringen af Påskedag, der som bekendt ikke falder på samme dato hvert år. Historien bag den Gregorianske kalender, er der sikkert mange(?) der finder interessant jeg gør ikke, og vil derfor ikke komme med en længere udredning om den. Hvis du er interesseret, kan du søge på nettet - du vil blive overrasket Kort fortalt: Kan man placere påskedag, kan man også placere alle andre danske helligdage. Påskedag falder på den første Søndag efter den første fuldmåne efter den 21. marts. Hvis denne fuldmåne falder på en Søndag, skal det være den følgende Søndag. Der findes mange forskellige algoritmer til at udregne ovenstående, jeg har valgt den første jeg fandt på nettet, som udemærker sig ved at være kompakt og overskuelig (læs: hurtig). Af forskellige (primært historiske) årsager, dækker algoritmen kun år 1700 2299. Algoritmen er af den tyske matematiker Carl Friedrich Gauss (1777-1855). PL/SQL løsning, version 1 Version 1 beregnede ved hvert eneste kald, om den aktuelle dato befandt sig I risikozonen, dvs. marts juni. Hvis dette var tilfældet, udregnede jeg placeringen af påskedag og de andre helligdage, for at se om der var et hit. Løsningen virkede, men det vil være løgn at påstå den var hurtig PL/SQL løsning, version 2 Løsningen var som med så meget andet i disse tider caching! Ved at udregne et helt år af gangen, og gemme udregningerne til efterfølgende kald, kan der spares mange beregninger. Jeg benytter en PL/SQL collection (PL/SQL tabel), hvor hvert år får tildelt 1000 elementer (elementer i en collection behøver ikke være fortløbende, og nye elementer kan indsættes før og efter eksisterende elementer). F.eks. vil år 1997 få tildelte elementerne 1997000 1997999. På den måde kan alle år (som understøttes af Carl Friedrich Gauss algoritmen) være i en enkelt collection. Første element i hvert årsinterval, dvs. element 1997000 for år 1997, benyttes som flag for om året allerede er beregnet. Dvs. ved første opslag på en dato i år 1997, vil værdien af element 1997000 fortælle at året ikke er beregnet. Derefter beregnes hele året, og flaget I element 1997000 sættes. Fremtidige opslag på datoer i år 1997 benytter herefter de allerede beregnede værdier. Der er ingen grund til at fylde 365 elementer ind for hvert år, vi kan nøjes med at udfylde de specielle datoer. Mangler et element (medfører exception NO_DATA_FOUND), er der tale om en almindelig dato. Det samlede forbrug af memory, bliver derfor ubetydeligt selv om der spørges til datoer i samtlige de 600 år som algoritmen dækker. Jeg vil ikke vise hele koden her (den kan downloades fra www.oracleekspert.dk), men vil dog vise et centralt udsnit, nemlig de 5 liniers kode, som er alt hvad der skal eksekveres for at besvare et spørgsmål af typen: Hvilken datotype er datoen 16/4-2001? Omformet til et kald til PL/SQL pakken Dates (bliver beskrevet senere) bliver det ldatetype:= Dates.dateType( c_normalday CONSTANT INTEGER := 0; c_grundlovsdag CONSTANT INTEGER := 1; -- Fra og med 1849 c_1maj CONSTANT INTEGER := 2; -- Fra og med 1891 c_christmaseve CONSTANT INTEGER := 3; -- Juleaften c_newyeareve CONSTANT INTEGER := 4; -- Nytårsaften c_saturday CONSTANT INTEGER := 5; c_sunday CONSTANT INTEGER := 6; c_newyearday CONSTANT INTEGER := 7; -- Nytårsdag c_palmsunday CONSTANT INTEGER := 8; -- Palme søndag c_holythursday CONSTANT INTEGER := 9; -- Skærtorsdag c_goodfriday CONSTANT INTEGER := 10; -- Langfredag c_eastersunday CONSTANT INTEGER := 11; -- Påskedag c_eastermonday CONSTANT INTEGER := 12; -- 2. påskedag c_greatprayer CONSTANT INTEGER := 13; -- Store Bededag c_ascensionthursday CONSTANT INTEGER := 14; -- Kristi himmelfart c_pentecost CONSTANT INTEGER := 15; -- Pinsedag c_pentecostmonday CONSTANT INTEGER := 16; -- 2. pinsedag c_christmas CONSTANT INTEGER := 17; -- Juledag c_2christmas CONSTANT INTEGER := 18; -- 2. juledag Figur 1 4 Juni 2001 OracleEkspert

TO_DATE('16/4-2001','dd/mm-yyyy') ); der medfører eksekvering af de centrale 5 liniers kode: lidx:= TO_NUMBER(TO_CHAR(pDate,'yyyy')) * 1000; RETURN gcalendar( lidx + TO_CHAR(pDate,'DDD')); EXCEPTION WHEN NO_DATA_FOUND THEN BEGIN RETURN gcalendar(lidx); Hvis det er første gang der spørges på en dato i et givet år, udføres der betydeligt mere kode (se FUNCTION datetype (pdate IN DATE) RETURN INTEGER FUNCTION datetypetoname (pdatetype IN INTEGER) RETURN VARCHAR2 Funktionen datetype modtager en DATE og afleverer en datetype (INTEGER), som er en af følgende konstanter (alle defineret i package specification): Bemærk grupperingen: 0 Normale dage 1-5 Mulige fridage. 6-18 Danske helligdage. Funktionen datetypetoname oversætter returværdien fra datetype til en streng med det danske navn for dagen. Et eksempel på brugen af begge funktioner ses i figur 2: SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 ldate DATE := TO_DATE('2001.04.06','yyyy.mm.dd'); 3 BEGIN 4 FOR i IN 0.. 12 LOOP 5 dbms_output.put_line( TO_CHAR(lDate + i,'dd/mm-yyyy') ' = ' 6 Dates.dateTypeToName(Dates.dateType(lDate + i)) ); 7 END LOOP; 8 END; 9 / 06/04-2001 = 07/04-2001 = Lørdag 08/04-2001 = Palme søndag 09/04-2001 = 10/04-2001 = 11/04-2001 = 12/04-2001 = Skærtorsdag 13/04-2001 = Langfredag 14/04-2001 = Lørdag 15/04-2001 = Påskedag 16/04-2001 = 2. påskedag 17/04-2001 = 18/04-2001 = PL/SQL procedure successfully completed. Figur 2 Dates.sql), men efterfølgende kald med dato i samme år (i eksemplet 2001), vil nøjes med ovenstående 5 linier. Dates pakken Jeg har valgt at lave en løsning, der er så generisk som muligt, da der er stor forskel på hvordan man ønsker at anvende sin helligdagsviden. Bankdage udregnes på en måde, fridage på en anden (endda forskellig fra organisation til organisation, branche til branche etc.). Bl.a. af hensyn til fridagsberegning, understøtter Dates pakken også 1. maj og Grundlovsdag. Tanken er, at man laver en wrapper funktion, dvs. pakker kald til Dates pakken ind i sin egen funktion, der passer 100% til det aktuelle behov. Dates pakken består af 2 funktioner: Performance test SQL> CREATE TABLE datetypes (thisdate DATE, type NUMBER); For at dokumentere at beregning er hurtigere end opslag i en pre-kalkuleret tabel, har jeg sammenlignet performance mellem de 2 metoder. Først den tabel-baserede metode. Tabellen oprettes, fyldes med data og indekseres (se figur 3): Den anonyme PL/SQL blok indsætter 2192 rækker, fra d. 1/1-1995 til og med d. 31/12-2000. Da vi ikke SQL> DECLARE 2 ldate DATE := TO_DATE('1995.01.01','yyyy.mm.dd'); 3 BEGIN 4 WHILE ldate < TO_DATE('2001.01.01','yyyy.mm.dd') LOOP 5 INSERT INTO datetypes VALUES(lDate,0); 6 ldate := ldate + 1; 7 END LOOP; 8 END; 9 / SQL> CREATE INDEX datetypes_i ON datetypes(thisdate, type); Figur 3 OracleEkspert Juni 2001 5

skal bruge kolonnen type til noget fornuftigt, indsættes blot 0. Hvis tabellen virkelig skulle bruges til opslag, skulle type naturligvis indeholde en værdi der beskrev den pågældende dato. Hvor hurtigt er tabelopslag så? Vi prøver med følgende, som slår alle 2192 datoer op 1000 gange (se figur 4)! Begge målinger er angivet som gennemsnittet af 3 kørsler. Omsat til procent er beregning ca. 51% hurtigere end tabelopslag. Når man tænker på hvor meget der foregår i kernen ved eksekvering af et SELECT udtryk - så er 51% ikke meget... Konklusion Beregning frem for tabelopslag, er klart at foretrække. SQL> SET TIMING ON SQL> DECLARE 2 ltype INTEGER; 3 ldate DATE; 4 BEGIN 5 FOR I IN 1.. 1000 LOOP 6 ldate := TO_DATE('1995.01.01','yyyy.mm.dd'); 7 WHILE ldate < TO_DATE('2001.01.01','yyyy.mm.dd') LOOP 8 SELECT /*+ INDEX(dateTypes datetypes_i) */ type INTO ltype 9 FROM datetypes 10 WHERE thisdate = ldate; 11 ldate := ldate + 1; 12 END LOOP; 13 END LOOP; 14 END; 15 / PL/SQL procedure successfully completed. real: 693572 Figur 4 Så benytter vi i stedet beregning, vha. funktionen Dates.dateType: SQL> DECLARE... samme kode som før, men linierne 8 10 er udskiftet med følgende linie 8 ltype := Dates.dateType(lDate);... 15 / PL/SQL procedure successfully completed. real: 339343 Vi slipper for irriterende vedligeholdelse og så er det hurtigere. Men samtidigt har ovenstående performancetest, fået mine øjne op for hvor langsomt et sprog PL/SQL er Med tanke på hvor lidt kode, der typisk udføres ved et enkelt kald, burde det være langt hurtigere. Måske skulle man alligevel begynde at bruge Java til sine beregningstunge (?) opgaver. Måske skulle jeg teste Java i forhold til PL/SQL? Det ka kun gå for langsomt! PL/SQL pakken Dates kan downloades fra www.oracleekspert.dk www.pythiainformation.com 6 Juni 2001 OracleEkspert

ORACLE8 GIS (GEEKY INTERNAL STUFF): PHYSICAL DATA STORAGE INTERNALS Dan Hotka is a Director of Database Field Operations for Quest Software. He has more than 20 years of experience in the computer industry and more than 15 years of experience with Oracle products. He is an acknowledged Oracle expert with Oracle experience dating back to the Oracle v4.0 days. He has co-authored the popular books Oracle Unleashed, Oracle8 Server Unleashed, Oracle Developer Unleashed, and Special Edition Using Oracle8/8i from SAMS Publications and is frequently published in Oracle Professional. He regularly speaks at Oracle conferences and user groups around the world. dhotka@earthlink.net. The relationship of table objects storage (segments) is that there s one segment header and one or more extents, which are made up of one or more contiguous data blocks. The first block of each Oracle segment is the segment header. A segment is made up of at least two blocks - the segment header and the initial extent. CREATE TABLE X (C NUMBER) Storage (INITIAL 1) creates a segment with two blocks. Block size The block size is defined at "CREATE DATABASE" time and can t be easily changed. The default block size for most systems is 2K. Oracle8 supports block sizes from 2K to 64K. Always choose a block size that s an even multiple of the operating system file system block size. If you were to make the Oracle block size smaller than the operating system block size, then extra data would always be read with each read operation. If the Oracle block size isn t an even multiple of the operating system block size, then there will be wasted disk space in the operating system file system. There s a distinct tradeoff between block size and performance. Larger blocks are useful for data warehouse and decision support systems. More data is read into memory with a single read operation, and more index leaf pointers can be stored in a single read operation. If an application has lots of updates and deletes (DML), then smaller blocks are useful. There will be less contention for rows because there will be fewer rows per block. You can query the X$KVIS view to see the actual values of db_block_size. Block header layout All Oracle blocks have similar attributes (see Figure 1). All blocks contain a header area. This header consists of a block type, a block format, relative database address (DBA), SCN, SCN sequence number, a check value, and a tail. These are some important block types: 1 Undo segment header 2 Undo segment block 5 Data segment header 7 Temporary table 11 Data file header Block format refers to whether this is an Oracle7 or an Oracle8 formatted block. The sequence number refers to the order of the blocks within the same SCN. The check value is an optional init.ora setting (DB_CHECK_SUM) that provides integrity checking at the block level. The tail is used as a block consistency check to ensure that the beginning of the block and the end of the block are consistent. This number consists of the SCN + block type + SCN sequence number. There are several methods to visualize or dump the data blocks. In UNIX, use the dd command: dd bs=2k if=/ora8/data/users01.dbf skip=200 count = 5 od -x > pg. In the VMS world, use the DUMP command: DUMP /BLOCKS = (START:<os block #>, END:,os block #>) /OUT = blockdmp.out users01.dbf. The NT world would use HEDIT. A formatted dump can be attained through Oracle via SVRMGR: alter system dump datafile 7 block 201. Since this discussion is about physical storage, this article will discuss the blocks related to physical storage such as segment headers and data blocks. A segment header is always the first block of an object. The segment header has six major areas: extent control header, map header, extent map, and three types of free lists. The extent control header contains the number of extents allocated to this segment, the number of blocks allocated to the segment, DBA of the last block of the extent map (0 if no UNLIMITED EXTENTS is used), number of extent map blocks, high water mark (HWM) extent size, HWM extent number, and HWM block number within the extent. DBA Teknisk Artikel Figure 1. Block Layout Figure 2. Space utilization in a segment OracleEkspert Juni 2001 7

The HWM is the pointer to the DBA of the last block to receive inserts. Blocks below this mark are maintained on free lists. Blocks in extents above this mark have been allocated to the segment but haven t been used yet. Blocks above the HWM are available for SQL*Loader direct load operations, parallel DML, and for inserts once the free list has been exhausted and the HWM has been moved. The map header simply contains DBA information of the next block containing extent map information. The extent map contains the beginning data block DBA and the number of blocks associated with the extent. The size of the extent map is directly related to the block size being used. For example, the extent map will be able to hold 121 extent locations for a 2K block. Oracle7.3 introduced a concept known as unlimited extents. Instead of having the block size constrained by a limited number of extents (such as 121 for a 2K block), Oracle allows for objects to grow and dynamically extend indefinitely by chaining additional blocks to store additional extent map information (see Figure 2). There are three types of free lists that store information about available space within a segment. Master free lists (MFL) contain newly allocated blocks up to the HWM and blocks freed by a committed transaction. Process free lists (PFL) are user-definable (storage parameter FREELISTS N) and are used to reduce contention on the master free list. This list spreads the requests over several blocks. The transaction free list (TFL) holds blocks freed by a particular transaction to see if that same transaction can later use the space. After the commit, this space is then put on the MFL. The MFL contains a flag that says whether the free list is used or not (1 or 0). The segment header also contains the DBA of the first block on the free list chain and the DBA of the last block on the free list chain. The blocks on the free list chain (FLC) will contain a flag indicating that this block is linked to the free list chain and the DBA of the next block on the chain. This information is stored in the cache layer of the data block header. Blocks below the HWM that meets the PCTFREE parameters are managed on the MFL. Finding free space Figure 3 shows how Oracle will look for free space to store a newly inserted row. Oracle searches the uncommitted TFL first. If it finds space, it will use the space; otherwise, it will search the PFL. Once again, if it finds space, it will use the space. Oracle will then search the MFL for free space. If it finds free space, it will move the space to the PFL and use it. Oracle will then search the committed TFLs; if it finds space here, it will move the space to the MFL and begin the whole search process over. If all of this isn t successful, then Oracle will see whether the HWM can be advanced. If it can, it will add this new space to the MFL and search again; otherwise, Oracle will add another extent to the object, advance the HWM, and search the MFL yet again for space. If max extents is hit, then the "max extents exceeded" error is returned; otherwise, the "no more space in tablespace" error is returned. An extent is a contiguous set of blocks as defined by the storage parameter. If the extent size is indicated in bytes, then Oracle will round up the extent size to the nearest multiple of five blocks or to the nearest multiple of the MINIMUM EXTENT storage parameter value (if defined). Oracle will search the dictionary cache first, looking for an exact extent size match. If not found, then it will search the fet$ for an exact or larger extent size match. If no exact match is found, then Oracle will repeat the two searches looking for a larger area. If found, Oracle will use the required extent size from the larger area. If no matches are found, Oracle will coalesce the tablespace and do this whole process again. If again no space is found, Oracle will round down the extent size and try the whole process again. If space still isn t found upon the third loop of this process, Oracle will either extend the tablespace (if option is set) or return an error (see Figure 4). Adjacent unused extents are coalesced together to create larger extents that might satisfy space searches more quickly. Free space can be coalesced via three methods: on demand (as needed during a search, as explained previously), manually "alter tablespace... coalesce," or by SMON. SMON will perform this action for the tablespaces during a space transaction and only if PCTINCREASE is greater than 0 at the tablespace level. Block cache, transaction, and data layers Data blocks also contain a cache layer, a transaction layer, and a data layer. This discussion will be limited Figure 3. Finding free space Figure 4. Dynamic extent allocation 8 Juni 2001 OracleEkspert

to data blocks, but it suffices to say that the contents of the data layer are dependent upon the type flag indicating what kind of block this is. The data block contains a header, a table directory, a row directory, row data, and hopefully some free space (see Figure 5). The block header contains the same static block information as all other blocks, as discussed previously. The cache layer contains information about the number of interested transaction lists (ITL) slots, a flag for data or index block, and free list information such as free list flag and next block on the free list (that is, the free list chain). The ITL is used to mark the row locked until the transaction completes. The ITL contains the transaction identifier. The ITL defaults to 1 and is maintained by storage parameters INITRANS and MAXTRANS. The number of ITLs controls how many concurrent DML operations can happen to a particular block. The Transaction layer contains the actual ITL number (or numbers, as determined by INITRANS and MAX- TRANS), the undo address information, a status flag, the number of rows being affected by this transaction, and free space credits. Free space credits holds any space that was freed by an update or delete until the commit actually occurs. ITLs do take space that would otherwise be available for rows. The table directory tracks the tables that have rows in this data block - that is, tables involved in a cluster. Transaction Free Lists (TFLs) are stored in the block as a separate structure and aren t controlled by any external parameters. There are a minimum of 16 per segment, which are created implicitly by Oracle. Each TFL is associated with only one transaction. If the limit of TFLs is reached, then the transaction will wait for a TFL to free. This activity can be monitored with V$WAIT and V$TRANSACTIONS. The row directory contains information about the rows stored in the data block. What s left after rows are added or updated and the block header information is accounted for determines the free space area. As rows are inserted or updated, the row data part grows from the end of the block toward the front. The block header will grow down from the top based on the number of ITLs, rows added, and so forth. This free space is managed by a combination of PCTUSED and PCTFREE storage clause parameters. PCTUSED determines when a block is no longer available for inserted rows. PCT- FREE determines when a block is again available to have inserted rows. Tip: The combination of PCT- FREE and PCTUSED should be 75 or lower. Note that PCTFREE will always default to at least 10 percent, even if it s set lower than 10 percent. Row layout Actual row data is added from the bottom of the free space in a block toward the top. The static part of the row format contains a row flag, a lock byte (ITL entry locking this row), number of columns in this row, and a cluster key indicator (see Figure 6). Then there are a column length (one byte if the length is < 254; otherwise, three bytes) and the actual column data. Trailing null value fields aren t stored. When reading a dump, the next row would be indicated by the presence of another row flag. Some values for row flag include the following: H Head of row piece K Cluster key D Deleted row F First data piece L Last data piece P First column continues from previous location Row migration/row chaining Row migration occurs when an updated row no longer fits into the existing block (see Figure 7). Row chaining occurs when a row is either inserted or updated and it s physically longer than the available block size (see Figure 8). It s been my experience that Oracle will migrate and/or chain rows based on a variety of conditions. Truncate table The truncate command is the quickest way to delete all of the rows from a table. This method of clearing out a table has no recovery. It s fast because it simply sets HWM, MFL, and TFLs to null. If the REUSE option isn t specified (default behavior), all of the extents except for MINEXTENTS are then released back to the tablespace. Full table scans scan through all of the blocks until it reaches the HWM. If objects are loaded with large numbers of rows, then most of the rows are deleted; the table should be reorganized to move the HWM where it belongs rather than leaving it at the end of many empty or almost empty blocks. Direct path loading Direct path loading is a very fast way of loading data into an Oracle database. This method of data loading completely bypasses the Oracle kernel (SGA, background processes, logging, and so forth). Direct path loading happens above the HWM. This method of loading data begins by putting a shared lock on the object being loaded. A temporary segment is then created based on the extent size of the object being loaded. The tablespace must have enough room to accommodate an extent size of the initial and next extent of Figure 5. Data block layout Figure 6. Row layout OracleEkspert Juni 2001 9

Figure 7. Migrated row layout the original table. This temporary segment is populated with the rows, and the extents are then added to the original table, with the HWM moved to the end of these new extents. SQL*Loader and some parallel operations use direct path loading. Temporary segments Temporary segments are needed when Oracle is unable to sort in memory. Create index or select statements that have order by, distinct, group by, or union clauses will cause a sort operation. The INIT.ORA parameter, sort_area_size, defines the amount of memory dedicated for sort operations. When this area is exhausted, then Oracle will use temporary segments to do the sort operation. There are two types of temporary storage: permanent tablespace (the tablespace as we know it) and temporary tablespaces. These are easily created by adding the TEMPORARY clause in the CREATE TABLESPACE command. Tablespaces can be Figure 8. exchanged with the ALTER TABLESPACE command. The basic difference between the two is that SMON will clean up unused temporary segments in a permanent tablespace where the segments are left alone after a sort operation in a temporary tablespace. Also, only temporary segments can exist in a temporary tablespace. This allows the space requirements of sort operations to grow and be maintained throughout the life of the instance. Monitor this sort area via V$SORT_SEGMENT and V$SORT_USAGE. Note: Use a consistent value for initial and next extent size with a PCTINCREASE = 0. Make the extent size a multiple of sort_area_size. Add one db_block size to allow for the segment header in the initial extent. OUGDK Oracle User Group Denmark er en selvstyrende gruppe for Oracle-brugere. Det er for tiden gratis at være medlem, dog skal man have en Oracle-databaselicens for at kunne blive medlem. Gruppen består af en bestyrelse og et antal Special Interest Groups, som afholder møder i Oracle Danmarks lokaler i Ballerup. Indkaldelse til møderne sker via brugergruppens mailliste og via brugergruppens web-side (www.oug.dk). Brugergruppens web-side er for tiden ikke tilgængelig. Designer SIG ens arrangementer kan dog stadig findes på www.deoliveira.dk/ougdk. DBA SIG Koordinator: Jean-Marc Pedersen Dato for næste møde er endnu ikke fastlagt. Designer SIG Koordinator: Marc de Oliveira, Marc@deOliveira.dk Næste møde: Juni 2001 Sted: Oracle Danmark, Lautrupbjerg 2-6, 2750 Ballerup Emner for næste møde: Vi forsøger nu at få Lucas Jellema til Danmark (ja, tingene ændrer sig hurtigt i denne tid!). Følg med på www.deoliveira.dk/ougdk. Developer SIG Koordinator: Lone Aalekjær, loaal@wmdata.com Dato for næste møde er endnu ikke fastlagt. Data warehouse SIG Koordinator: Erik Haar, erh@lundbeck.com Dato for næste møde er endnu ikke fastlagt. Web SIG Gruppen er lukket ned indtil en ny koordinator er fundet. Husk at tilmelde dig til møderne hos Christian.Graversen@Oracle.com (ellers får vi for få kager/vand!!) 10 Juni 2001 OracleEkspert

TOP-N QUERY Af Martin Jensen - Oracle Consulting. Martin har siden 1982 arbejdet med bl.a. Oracles databasekerne, samt med anvendelse af Designer s Repository til diverse kvalitetsbevarende øvelser. Martin.Jensen@Oracle.com Allerførst må vi lige skalere EMP tabellen lidt op, hvortil vi skal bruge en tabel med ethundrede tusinde rækker: Antag at all_tab_columns har mere end 50,000 rækker: create table hundred_thousend as select rownum r from all_tab_columns where rownum <= 50000 union all select rownum + 50000 r from all_tab_columns where rownum <= 50000; Opret nu tabellen BIGEMP med 1,400,000 rækker: create table bigemp storage ( initial 1M next 1M pctincrease 0 ) as select empno, ename, sal * r salary from scott.emp, hundred_thousend; Så mangler vi bare at generere statistik om tabellen: analyze table bigemp compute statistics; Vores første bud på at finde rækkerne med de 10 højeste lønninger kunne se således ud: select ename, salary from bigemp where rownum <= 10 order by salary desc; ENAME SALARY ---------- ---------- SMITH 8000 SMITH 7200 SMITH 6400 SMITH 5600 SMITH 4800 SMITH 4000 SMITH 3200 SMITH 2400 SMITH 1600 SMITH 800 Ups - det gav jo ikke det ønskede resultat fordi order by afvikles efter de 10 rækker fremfindes! Men hvad så med at bede databasen om at sortere før de 10 rækker trækkes ud? Vi ved jo at en union, distinct eller group by foretager en intern sortering! select -1* s, ename from ( select -1*salary s, ename from bigemp union select 1, 'hello' from dual where 1 = 2) where rownum <= 10; -1*S ENAME ---------- ---------- 500000000 KING 499995000 KING 499990000 KING 499985000 KING 499980000 KING 499975000 KING 499970000 KING 499965000 KING 499960000 KING 499955000 KING 10 rows selected. Elapsed: 00:00:20.40 Se Execution Plan på figur 1. Og med anvendelse af distinct kunne det se således ud: select -1*s, ename from ( select distinct -1*salary s, ename from bigemp) where rownum <= 10; -1*S ENAME --------- ---------- 500000000 KING 499995000 KING 499990000 KING 499985000 KING 499980000 KING 499975000 KING 499970000 KING 499965000 KING PL/SQL Teknisk Artikel Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=19201 Card=1400082 Bytes=28001640) 1 0 COUNT (STOPKEY) 2 1 VIEW (Cost=19201 Card=1400082 Bytes=28001640) 3 2 SORT (UNIQUE STOPKEY) (Cost=19201 Card=1400082 Bytes=14000000) 4 3 UNION-ALL 5 4 TABLE ACCESS (FULL) OF 'BIGEMP' (Cost=598 Card=1400000 Bytes=14000000) 6 4 FILTER 7 6 TABLE ACCESS (FULL) OF 'DUAL' (Cost=1 Card=82) Statistics ---------------------------------------------------------- 10 recursive calls 39 db block gets 3952 consistent gets 3951 physical reads 0 redo size 795 bytes sent via SQL*Net to client 424 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 1 sorts (disk) 10 rows processed Figur 1. Execution Plan OracleEkspert Juni 2001 11

499960000 KING 499955000 KING 0 rows selected. Elapsed: 00:00:18.87 Se Execution Plan på figur 2. Men hov! Her står jo at læse at vi anvender en reel sortering (1 sort (disk)), selvom vi i 8iNF kursusmaterialet fortalte, at det faktisk er muligt at finde de n største uden at foretage en egentlig sortering; og ifølge development fortsætter vi med dette i første release af Oracle9i Execution Plan --------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=19198 Card=1400000 Bytes=28000000) 1 0 COUNT (STOPKEY) 2 1 VIEW (Cost=19198 Card=1400000 Bytes=28000000) 3 2 SORT (UNIQUE STOPKEY) (Cost=19198 Card=1400000 Bytes=14000000) 4 3 TABLE ACCESS (FULL) OF 'BIGEMP' (Cost=598 Card=1400000 Bytes=14000000) Statistics --------------------------------------------------------- 10 recursive calls 39 db block gets 3952 consistent gets 3951 physical reads 0 redo size 795 bytes sent via SQL*Net to client 424 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 1 sorts (disk) 10 rows processed Figur 2. Execution Plan Men fra Oracle8i kan samme resultat formuleres lidt enklere: select ename, salary from ( select ename, salary from bigemp order by salary desc) where rownum <= 10; ENAME SALARY ---------- ---------- KING 500000000 KING 499995000 KING 499990000 KING 499985000 KING 499980000 KING 499975000 KING 499970000 KING 499965000 KING 499960000 KING 499955000 10 rows selected. Elapsed: 00:00:16.93 Se Execution Plan på figur 3. Bemærk i øvrigt at det fra Oracle8i faktisk er muligt at have views med order by: create or replace view bigemp_v as select ename, salary from bigemp order by salary desc; select ename, salary from bigemp_v where rownum <= 10; I øvrigt fås samme resultat ved at anvende de nye analytiske SQL muligheder men det er ikke hurtigere, check selv: select ename, salary from ( select ename, salary, rank() over (order by salary desc) as salary_rank from bigemp ) where salary_rank <= 10; select ename, salary from ( select ename, salary, row_number( ) over (order by salary desc) as salary_row_number from bigemp) where salary_row_number <= 10; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=19198 Card=1400000 Bytes=28000000) 1 0 COUNT (STOPKEY) 2 1 VIEW (Cost=19198 Card=1400000 Bytes=28000000) 3 2 SORT (ORDER BY STOPKEY) (Cost=19198 Card=1400000 Bytes=14000000) 4 3 TABLE ACCESS (FULL) OF 'BIGEMP' (Cost=598 Card=1400000 Bytes=14000000) Statistics ---------------------------------------------------------- 10 recursive calls 39 db block gets 3952 consistent gets 3951 physical reads 0 redo size 797 bytes sent via SQL*Net to client 424 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 1 sorts (disk) 10 rows processed Figur 3. Execution Plan 12 Juni 2001 OracleEkspert

Fax eller send kuponen til: Pythia Information Kongensvej 3 2000 Frederiksberg Fax: 26199991 ABONNEMENT Ja tak, jeg ønsker: Eller bestil via vores hjemmeside: http://www.oracleekspert.dk Eller e-mail nedenstående oplysninger til: salg@oracleekspert.dk stk stk stk stk stk stk stk stk OracleEkspert nr 1 - DKK 125,00 pr stk...dkk OracleEkspert nr 2 - DKK 125,00 pr stk...dkk OracleEkspert nr 3 - DKK 125,00 pr stk...dkk OracleEkspert nr 4 - DKK 125,00 pr stk...dkk OracleEkspert nr 5 - DKK 125,00 pr stk...dkk OracleEkspert nr 6 - DKK 125,00 pr stk...dkk OracleEkspert nr 7 - DKK 125,00 pr stk...dkk 1 års abonnement (6 numre) - DKK 600,00 pr stk...dkk Jeg vil gerne begynde abonnementet med OracleEkspert nr: - 40% ved samtidig køb af minimum 5 blade eller abonnementer...dkk - 45% ved samtidig køb af minimum 10 blade eller abonnementer...dkk - 50% ved samtidig køb af minimum 20 blade eller abonnementer...dkk - 60% ved samtidig køb af minimum 50 blade eller abonnementer...dkk Bemærk: Når abonnementerne købes med mængderabat bliver alle blade sendt i én samlet forsendelse. Det er altså ikke muligt at få bladene sendt til individuelle modtagere. Pris i alt...dkk Firma: Navn: Adresse: Postnr/By: Land: E-mail: Priserne er excl moms. Ved hver tegning af minimum 1 års abonnement på OracleEkspert sender vi et stk signeret kvalitetskopi af Oraclerne til den læser, som har refereret den nye abonnent til os. Kopien er trykt på kraftigt papir og signeret med rød tush. En OracleEkspert-læser er en person med eget abonnement eller en person ansat i et firma, som har tegnet abonnement på OracleEkspert. Refereret af: Adresse: Man kan ikke referere et abonnement til sig selv. Postnr/By: Som referencegave ønskes en signeret kopi af Oraclerne fra OracleEkspert: Nr 1 Det er fordi de ikke kan li fremmednøgler... [ ] Nr 2 Det er jo også vores Designer mand... [ ] Nr 3 Har du prøvet at skifte din Where-clause ud med en Santa clause?... [ ] Nr 4 Pro*C... [ ] Nr 5 No more table space...[ ] Nr 6 Komme i Forms...[ ] OracleEkspert Juni 2001 13

Fortsat fra side 3 enten/eller, for hvis man vil have virkelig ekspertviden ind, så er det yderst sjældent man som virksomhed har tid og råd til at kultivere specialer. Det er nok her, jeg finder at dit indlæg mest lugter af sure tæer, for der er i de fleste tilfælde ikke noget alternativ til at bruge konsulenter. Ikke kun fordi de "dygtige" er selvstændige i dag, men også fordi det er uøkonomisk for en virksomhed at opretholde et beredskab af viden, som kun skal bruges sporadisk. Hvor meget kan du forlange mht. pris-effektivitet, fleksibilitet og hurtige kurs-ændringer af fastansat personale? Ikke meget, ihvertfald ikke i de virksomheder, hvor der "går fagforening i den" med hæve/sænke-borde, frisk frugt, Ginseng, børnepasning og vitaminpiller (dette er virkelig eksempler fra danske virksomheder). Men konsulenter kan jo altid holdes op mod hinanden, og har motivationen til at være på forkant hurtigt (hvilket iøvrigt er noget af det, der gør det sjovt for dem. En person, der laver noget han/hun er god til, står jo dybest set stille og mister markedsværdi). Marc de Oliveira: Jeg vil medgive dig, at jeg burde have håndteret din pointe om deling af meget specialiseret viden lidt bedre. Den var ikke central for min leder, men det fik jeg ikke rigtigt gjort opmærksom på. Jeg ser konsulentmarkedet som 10% meget dygtige specialister, og 90% jævne konsulenter, som lige så godt kunne være fastansat. Min erfaring, da jeg havde seks konsulenter gående, var at jeg selv var mindst 2-3 gange hurtigere om at løse en hvilken som helst af vores opgaver end nogen af konsulenterne. Kun XXX, som vi har haft gående i det meste af tre år, kan gå ind og løse opgaver lige så effektivt, som jeg selv. Så det er ikke kun merprisen, der er en faktor. Det er prisen holdt op mod den meget lave effektivitet man kan forvente af en konsulent, i den første meget lange tid (her tænker jeg så ikke på de 10%, som er meget dygtige til lige præcis den opgave, de bliver hyret til at løse, men på de 90% all-round'ere, som har 5-10 års erfaring med alt muligt inde for Oracle-verden). Jeg er helt enig i, at vi er ved at bevæge os over i en struktur, hvor vi alle bliver mere selvstændige, og det er netop denne bevægelse min leder stiller spørgsmålstegn ved. Er det virkelig i nogens interesse at vi alle bliver så uafhængige? Jeg er ikke enig i, at det nødvendigvis er de dygtigste, som bliver selvstændige. I univeristetsverden har man også kunnet fastholde mange af de dygtigste folk ved give dem frie rammer til at forske og adgang til meget store ressourcer at arbejde med - på trods af den begrænsede løn. Denne rubrik er åben for alle spørgsmål, forslag og tilkendegivelser om Oracle eller OracleEkspert, hvad enten de er tekniske eller mere strategiske. Indlæg kan godt være anonyme, men redaktionen skal vide, hvem der har skrevet dem. Oracle Danmark Support og Metalink tilbyder, at besvare de tekniske spørgsmål. SKRIV EN ARTIKEL Vi betaler dig 700 kr pr side for artikler, som trykkes i OracleEkspert (400 kr pr side for engelsksprogede artikler). Du kan også komme til at vinde OracleEkspertprisen, som i december-nummeret uddeles til forfatteren af årets bedste artikel. Deadline for artikler til OracleEkspert nr 7 (august 2001) er fredag den 11. juli 2001. Har du lavet noget genialt, som kunne have interesse for andre Oracle-udviklere, ledere, planlæggere mv, så skriv en artikel til OracleEkspert. Sådan gør du: Aflever et oplæg på ca 200 ord via vores hjemmeside: www.oracleekspert.dk Når oplæget er godkendt af redaktionen, kan du skrive selve artiklen. Du kan hente en template på vores hjemmeside. Artiklen skal også godkendes af redaktionen. Dette sker ud fra kriterier om seriøsitet, relevans og teknisk niveau. Artiklerne skal henvende sig til erfarne Oraclefolk. Emnet skal blot være relateret til Oracle. Den normale størrelse af en artikel er 3-6 sider. Hvis din artikel falder udenfor denne størrelse, bør du gøre os opmærksom på det, inden du begynder at skrive den. Tips: Tips, som trykkes i OracleEkspert, belønnes med en flaske Leoville Barton 1997 Grand Cru til en værdi af ca DKK 400. Indryk en jobannonce i OracleEkspert DKK 1.500 (excl moms) for 1/4 side Salg@OracleEkspert.dk 14 Juni 2001 OracleEkspert

SIMULATING OPS$ USERS THROUGH A BROWSER Marc de Oliveira is Team Leader at Novo Nordisk Engineering. He has worked with Oracle products (mainly CASE/Designer) since 1989. He is coordinator of the Danish Designer SIG and the Scandinavian reseller of DesignAssist. Marc@deOliveira.dk. What s your problem? Why would you want to simulate OPS$ users through a browser? To those not familiar with OPS$ users I should quickly fill you in. OPS$ users are also known as Operating System authenticated users. This is a very old Oracle feature that lets you bypass the Oracle login for users that have already been authenticated by a secure operating system like Unix or MS-network. In case we are sure that user X has been logged securely into the operating system there really is not much point in demanding an Oracle username and password, because we already know who the user is. So the OPS$ feature allows the end user to connect to an Oracle database without having to remember an Oracle username and password. Sounds great, right? If all your users are authenticated when logging into the same MS-domain they should be able to pass that login information to the Oracle database automatically, so that they can run intranet applications without being prompted for an Oracle username and password. Well, unfortunately Oracle does not support that, but if you would like to do it anyway then read on. The solution presented here is only relatively secure. It is secure enough to only allow users that are authenticated to the OS to login to the Oracle database. But smart Oracle users will be able to find a way to log into the database as another OS user than the one they logged into the OS as. You can do a number of things to diminish this loophole, but it will always be there. I ll get back to the security issues at the end of the paper. The solution shown here will work on any Oracle WebServer (WAS, OAS or ias). In the following I will be using the term WebServer referring to any of the Oracle WebServers. Why simulate? Why not use real OPS$ users? Operating System authentication has been a standard feature in Oracle for the past ten years but unfortunately it never made it into the Internet Age. The Internet Changes Everything, well, for people using OPS$ users it really did, because they had to give up this feature to be able to let their users connect individually to the database through a browser (for WebForms, WebDB or Designer WSG modules). OPS$ users still work in Client/Server mode for Forms, Reports, SQL*Plus etc but if the same users have to access Oracle through a browser as well, you must redefine them as regular Oracle users with an individual username and password, because OPS$ users and regular Oracle users cannot co-exist. You cannot create an Oracle user that can connect both as an OPS$ user (without the username and password) and as a regular Oracle user (with the username and password). So, we need to define an architecture that will allow for Operating System authentication on both Client/Server and Web applications without using the build-in OPS$ feature. We have to simulate OPS$ users. The Oracle username and password The first thing to do is to define a way to map OS usernames with Oracle usernames and passwords. On our site we have decided to map the OS username with the Oracle username directly but you are not restricted to that. You could decide to add OPS$ to the OS username, so that OS user USER1 logs into the database as OPS$USER1, or you could completely encrypt the OS username into an unrecognizable Oracle username, so that OS user USER1 becomes Oracle user XYZ123456. The simplest possible function for mapping an OS username to an Oracle username follows here: FUNCTION MAKE_USERNAME (p_os_username in varchar2) return varchar2 IS v_db_username varchar2(30); BEGIN v_db_username:= p_os_username; RETURN (SUBSTR(v_db_username,1,30)); END; In parallel, it is necessary to define a way to map the DB username with the Oracle database password. The following function does that in a very simple way. I will leave it up to you to improve the function to make a more advanced mapping. FUNCTION MAKE_PASSWORD (p_db_username in varchar2) return varchar2 IS v_password number:= 1; BEGIN FOR i IN 1..length(p_db_username) LOOP v_password:= v_password * ASCII(SUBSTR(lower(p_db_username),i,1)); END LOOP; RETURN( PW SUBSTR(TO_CHAR(v_password),1,28)); END; Creating database users The next step is to create (or update) your database users using the above functions so that they all have a derivable password not known to themselves. A create script would look something like this: SET FEEDBACK OFF SET LINESIZE 200 SET PAGESIZE 0 SET HEADING OFF SPOOL create_user.ex SELECT 'CREATE USER ' MAKE_USERNAME('&1') Web Teknisk Artikel OracleEkspert Juni 2001 15

' IDENTIFIED BY ' MAKE_PASSWORD(MAKE_USERNAME('&1')) ' DEFAULT TABLESPACE DEFAULT_TS ' ' TEMPORARY TABLESPACE TEMP_TS;' FROM DUAL; SPOOL OFF START create_user.ex HOST del create_user.ex while a script for updating all your existing users would look something like this: SET FEEDBACK OFF SET LINESIZE 200 SET PAGESIZE 0 SET HEADING OFF SPOOL update_users.ex SELECT 'ALTER USER ' USERNAME ' IDENTIFIED BY ' MAKE_PASSWORD(USERNAME) ' DEFAULT TABLESPACE DEFAULT_TS ' ' TEMPORARY TABLESPACE TEMP_TS;' FROM SYS.DBA_USERS WHERE USERNAME IS NOT NULL AND USERNAME NOT IN ('SYS', 'SYSTEM'); SPOOL OFF START update_users.ex HOST del update_users.ex Now that all your users do not know their own passwords you really need to go the next step, so that they can automatically be logged on! Automatic login through the Web The logging into the database through the web browser is divided into three steps. First, we need to extract the login information, then we need to perform the login without making the WebServer invoke the login dialog. The third step is a necessary extra redirection. These steps are explained in the following. Extract the OS Username The Oracle WebServer does not have direct access to the OS username of the users requesting access to the database, so we need to extract the OS username in the MS environment. This can be done easily by using a Microsoft product like Active Server Pages (ASP). The ASP page needs to be called with the name of the Oracle procedure to be executed as an argument, so that the user can be redirected to the desired PL/SQL module after login. The URL to the ASP will look something like this (let us say that the ASP file is called START.ASP): http://<url to ASP directory>/ start.asp?module=mymodule$.startup To extract the argument MODULE and the current users OS username, the ASP file must look like this: <% p_module = Request("MODULE") v_os_username = LCase(Request.ServerVariables("Remote_User")) %> We then need to make ASP functions corresponding to the above MAKE_USERNAME and MAKE_PASS- WORD to map the extracted OS username to the corresponding database username and password. The main difference between ASP and PL/SQL is that you do not need to define your variables. MAKE_USERNAME would look like this: <% v_db_username = v_os_username %> MAKE_PASSWORD would look like this: <% i = InStr(v_os_username,"\") v_db_username = Mid(v_db_username,i+1,Len(v_db_username)-i) v_password = 1 for j = 1 to Len(v_db_username) v_password = v_password*asc(mid(v_db_username, j, 1)) next v_password = "PW" & v_password %> At this point, the ASP page have values for p_module, v_os_username, v_db_username and v_password. Note: If the module which you wish to call (p_module), has arguments you will have to hide the &-characters so that they are not interpreted as arguments for the ASP page. You could replace the &-characters with *- characters, like this: http://<url to ASP directory>/ start.asp?module=mymodule$.startup? myarg1=a*myarg2=b Log onto Oracle through the ias The actual logging into the Oracle database can be done from the above described ASP page using a little JavaScript to redirect the browser to an Oracle module. The login information can be placed in the URL like this: http://<username>:<password>@<url> so the necessary JavaScript code will look as shown in figure 1. The <URL to plsql-cartridge> looks different depen- <% response.write "One moment, please..." Response.Write "<SCRIPT LANGUAGE=""JavaScript"">" + CHR(13) Response.Write "<!--" + CHR(13) Response.Write "{"+ CHR(13) Response.Write "self.location.href = ""http://" & v_db_username & ":" & v_password & "@<URL to plsql-cartridge>/redirect?p_arg1=" & p_module & """"+ CHR(13) Response.Write "}"+ CHR(13) Response.Write "// -->"+ CHR(13) Response.Write "</SCRIPT>"+ CHR(13) %> Figure 1. Log onto Oracle through ias 16 Juni 2001 OracleEkspert

ding on which WebServer you are using. The second redirection Note that the above JavaScript is redirecting the browser to a plsql-module called REDIRECT with p_module as an argument. This second redirection is necessary to remove the username and password from the URL. If we did not do this, the username and password would permanently be visible in the URL, which would allow another user to note and reuse that username and password from his/her own computer to login as the other user. Another problem with keeping the username and password in the URL is that List Of Values generated from Designer will not work because the URL somehow is not recognized. As the REDIRCT procedure is called, the user is logged into the database, so we can now make the second redirection to the desired module without specifying the username and password. The REDIRECT procedure should look something like this: htp.print( '<html> ' '<head> ' '<META HTTP-EQUIV="REFRESH" CONTENT="0;' ' URL=' REPLACE(p_arg1,'*','&') ' ">' '</head>' '</html>'); The REPLACE is for converting the argument separation *-characters back to the necessary &-characters (se section Extract the OS Username). Done! With the above described ASP page and REDIRECT procedure installed on you system, MS-domain users will be able to access the Oracle procedure MYMOD- ULE(MYARG1, MYARG2) through their own schema, without being prompted for a username and a password. Just let them click on a link like this from a simple HTML page: http://<url to ASP directory>/ start.asp?module=mymodule$.startup? myarg1=a*myarg2=b Automatic login through Client/Server As Oracle schemes cannot be both OPS$ users and regular users at the same time we cannot use the supported OPS$ feature for our Client/- Server modules after having implemented the a- bove architecture for connecting to the database through a browser. Instead we need an architecture corresponding to the one for Web access where a startup form is called with a minimal connect string that can then calculate the database username and password to be used, make that connection and then call the desired form. declare v_os_username varchar2(30); v_db_username varchar2(30); The Minimal Scheme First you need a minimal scheme on the database that can connect to the database and nothing else. You might create the scheme like this: CREATE USER STARTUP IDENTIFIED BY NOT_SECRET; GRANT CONNECT TO STARTUP; This scheme is used to launch the startup form with the name of the desired form as a parameter, like this: Ifrun60.exe module=startup userid=startup/not_secret p_module=myform The Logon Scheme Next you need another minimal scheme on the database that can connect to the database and has access to the MAKE_USERNAME and MAKE_PASSWORD functions. You might create the scheme like this: CREATE USER LOGON IDENTIFIED BY SECRET; GRANT CONNECT TO LOGON; GRANT EXECUTE ON MAKE_USERNAME TO LOGON; GRANT EXECUTE ON MAKE_PASSWORD TO LOGON; This scheme is used from within the startup form to connect to the correct database user and launch the desired form. I need both the STARTUP scheme and the LOGON scheme to prevent end users from seeing the password of the LOGON scheme. More on this in the Security section. The Startup Form The startup form is a simple form with one small navigable item, a parameter called p_module and a whennew-form-instance trigger for launching the desired form. The trigger will look like figure 2. To get the OS username of the current user, I use the Win_API_Environment package contained in the D2KWUTIL.PLL library. The newest version of the D2KWUTIL.PLL library can v_password varchar2(100); v_connect varchar2(30); begin v_os_username:= lower(win_api_environment.get_windows_username); v_connect:= get_application_property(connect_string); logout; logon('logon', 'SECRET@<connect string>'); v_db_username:= make_username(v_os_username); v_password:= make_password(v_db_username); logout; logon(v_db_username, v_password '@' v_connect); new_form(:parameter.p_module); end; Figure 2. When-new-form-instance trigger be downloaded from: ftp://oracle-ftp.oracle.com/dev_tools/ OracleEkspert Juni 2001 17

patchsets/dev2k/win95nt/d2kwutil/ That s it The resulting functionality is that the end user starts up the startup form that barely shows up before the desired form is opened instead. The startup form is not running in the background. Security issues In this section I will discuss some of the security issues raised by this OPS$ simulation. The ASP files The code for generating the database usernames and passwords is placed in the start.asp file which is just a simple text file. You should make sure that end users do not have read access to that file, while the ASP web server (Microsoft InformationServer) must be setup to be able to execute ASP files in the directory containing the start.asp file. This can be achieved by placing the ASP file in a directory only accessible to one specific user (it could be the Administrator), and map that directory to a virtual directory defined to access the physical directory as that user. Make sure that the virtual directory is defined with the Source option disabled, so that end users cannot request to see the source code of the ASP file. Another solution would be to wrap the code for making the username and password in an ActiveX component on the InformationServer and place the component somewhere not accessible to external users. Then the ASP file would just call the ActiveX component without revealing how the username and password is constructed. Getting around the MS-domain When logging into a PC, end users have the option to bypass the login dialog by pressing the Cancel button. When doing this, they will still have web access and, hence, be able to invoke the start.asp file. If end users bypass the login dialog they will not get an OS username and therefore the start.asp program will not be able to log them into the database. Even if the end user creates a local user and logs in locally as that user, that OS username will not be retrieved by the Request.ServerVariables("Remote_User") command. The MAKE_USERNAME and MASK_PASSWORD functions These functions can be used to generate the database username and password of any OS user so you should be very careful with whom you grant them to. The only scheme that needs access to these functions is the LOGON scheme, so be very careful about who gets to know about the password to the LOGN scheme. The password to the LOGON scheme is written in the STARTUP form, so it is important that end users do not have access to the STARTUP.FMB file. The password to the STARTUP scheme is kind of public but that does not affect security as the START- UP scheme does not have access to anything. The URL As the database username and password is passed to the REDIRECT procedure through the URL, it will be visible to the end user for a short time while the page is performing the second redirection (see the section about the second redirection). This means that an end user is exposed to his/her own database username and password for a short time (less than a second) every time a start.asp link is invoked. This is not a serious security problem because all users are able to connect as themselves, anyway. It still makes it possible for one end user to see another end user s database username and password if he/she can get access to the other end user s PC. To prevent this problem, end users must know that they should not leave their PCs without locking them first (or log of the domain entirely). Another solution is to expire the passwords often (see the next section). Password expiration Because all passwords are systematically generated using the function MAKE_PASSWORD it is easy to have them changed often to improve the security. By doing this, an end user that somehow got hold of another end user s database username and password (as explained in the previous section) would only be able to use that login information for a limited period. If you make the MAKE_PASSWORD function dependent of the current date and have a recurring job updating all passwords accordingly every night just after midnight, any password would only be valid for 24 hours. If you want to expire the passwords more often than this (every hour, maybe) you should make sure that the web server is set to Keep Database Connection Open between Requests, so that users are not forced reconnect all the time. Conclusion So there you have it. If you trust your MS-network, with a little PL/SQL, JavaScript, ASP, HTTP and HTML it is possible to let your users individually log directly into the database without prompting them for at username and a password. It is not a completely secure architecture but for most organizations I would say that it is secure enough because, 1) end users cannot get access to the database without logging into the MS-network first, and 2) after logging into the MS-network they have to be pretty smart to get access to another account than the one they logged onto the MS-network with. 18 Juni 2001 OracleEkspert

16. maj 2001 Oracle databasen er #1 til CRM 57% af all CRM-systemer er ifølge TDWI (The Data Warehouse Institute) baseret på Oracle databaser. Microsoft er #2 med 26% og IBM er #3 med 17%. Se også: http://www.oracle.com/- tellmemore/?709479 16. maj 2001 FastForward Mobile Email and Corporate Directory Oracle annoncerede i dag et nyt produkt, som gør det muligt for medarbejdere at få adgang til e-mail og egne og kollegaers kalenderoplysninger fra mobiltelefoner og andre ledningsfri enheder som PDA er. Systemet kan installeres på 15 dage. En række firmaer har allerede bestil produktet. Deriblandt Cap Gemini og Hewlett-Packard. 15. maj 2001 NATO implementerer E-Business Suite Oracle og NATO annoncerede i dag at Nato implementerer E-Business Suite i 19 hovedkvarterer fordelt i 12 forskellige lande. Produktet kaldes NATO Automated Financial System og installeres af Oracle Consulting og Support Service. Se også: http://www.oracle.com/- tellmemore/?714597 10. maj 2001 Microsoft går efter Oracle og Sun Chief Executive Steve Ballmer sagde i dag, at Microsoft vil gå efter servermarkedet. I dag udgør Microsofts salg af serversoftware 12% af Microsofts indtægter (ca USD 3 mia), men Ballmer forudså, at det på sigt kunne nå helt op på 20%. 24. april 2001 Ellison peger på efterfølger Larry Ellison regner med at blive siddende som administrerende direktør for Oracle i mindst 5-10 år endnu, men forespurgt om hvem der var nummer 2 efter at Ray Lane forlod Oracle, peger han på to personer: Executive Vice President Safra Catz og Chief Financial Officer Jeff Henley. Ellison siger at han desuden er ved at køre et antal yngre personer i stilling til at kunne overtage firmaet. 23. april 2001.NOW overhaler.net Oracle kritiserer i dag, at Microsoft endnu ikke har leveret.net det lovede udviklingsmiljø til mobil udvikling. Oracle tilbyder allerede Shared Web services.now og udviklingsmiljøet OracleMobile Online Studio, som er til 100% netbaseret udvikling med udvikling, afprøvning og implementering via nettet. Med få liniers programmering kan shared services integreres. I dag tilbydes bla Location awareness, Driving Directions og Yellow Pages. 12. april 2001 Oracle #1 i sikkerheds-certificering Oracle offentliggjorde i dag at deres database har fået 13 sikkerhedscertificeringer. Disse inkluderer ICSEC, ITEC og Common Criteria. Til sammenligning har Microsoft een certificering, mens IBM har nul. cashing foretaget af eweek kan antallet af genererede dynamiske websider per sekund øges med 30 gange ved at bruge ias9i. 31. marts 2001 Ellison får forbud mod at lande jetjager Larry Ellison har fået afslag på et krav om at få lov til at lande sin Gulfsteam V jetjager i San Joses internationale lufthavn mellem kl. 23:30 og 06:30. Afslaget betyder at Ellison må tilbage i retten den 9. april for at fortsætte sagen mod San Jose. Ellison er ved at bygge 9.4 hektar villa i japansk stil ved Woodside til USD 80 mill. Det hævdes at Ellison har brudt landingsforbudet seks gange på et år. Det er forbudt at lande fly på over 34 tons om natten, men selv om Ellisons jet kan lastes til 41 tons hævder hans pilot at det aldrig vejer mere end 34 tons, når de lander i San Jose. Desuden støjer Gulfstream V jetjageren mindre end mange fly, som vejer mindre end 34 tons. 26. marts 2001 Oracle vil bygge digitalt hospital Hospital and rehabilitationchain HealthSouth Corp. og Oracle vil bygge et digitalt hospital, som skal forbedre patienternes behandling og eliminere papirarbejdet. Målet er at have udviklet USAs teknologisk mest avancerede hospital inden udgangen af 2003. Nyheder 30. april 2001 Langsomt salg de næste 2-3 kvartaler George Roberts, Oracle's executive vice president of North American sales, sagde i dag, at salget, grundet den generelle udmatning i den amerikanske økonomi, kunne forventes at gå langsomt de næste 2-3 kvartaler. Rygter siger, at Oracle snart bliver nødt til at nedskrive forventningerne til 4. kvartal, som ender i maj. 9. april 2001 Oracle annoncerer idevelop2001 Online idevelop2001 Online er en 100% web-baseret 24x7 løsning til uddannelse og træning via OTN. OTN rundede samtidig 1.5 millioner medlemmer. 4. april 2001 SAP og Yahoo går sammen om at udvikle portal software SAP og Yahoo vil bygge software til at lave business-portaler. 4. april 2001 eweek bekræfter at ias9i giver øget performance Ifølge en undersøgelse af ias9is indbyggede statiske og dynamiske 21. marts 2001 2. generation af New Internet Computer I dag blev 2. generation af NIC en offentlig gjort. Den koster USD 199 og er baseret på NIC OS version 2.0. Ellison hævder stadig, at NIC en er det næste evolutionære skridt efter PC en. 20. marts 2001 Oracle vil fyre 2% af medarbejderne For at imødegå den langsomme økonomi vil Oracle nedlægge 866 stillinger. OracleEkspert Juni 2001 19

PL/SQL Metode Teknisk Artikel CUTTING CODE WITH STYLE PART II Scott Hollows is Product Manager for Seeristic. He is an expert in a wide range of Oracle technologies and was previously Senior Principal at Oracle s world corporate headquarters in Redwood Shores, California. Email: shollows@seeristic.com Introduction This article is part II of a two part series that explains a recommended coding style that is easy to write, read and maintain. In the last issue, we examined commenting and layout issues for SQL and PL/SQL. This issue will focus on various structures of SQL and PL/SQL including SELECT, INSERT, IF and LOOPS. SELECT Statements The layout of this SELECT statement is easy to read /* Data Model (*1) EMP >- 1 DEP >- 2 LOC */ and maintain. Of course, it does take a little extra effort to write, but the effort is well worth the benefits. It includes the following features: (*1) A Data Access Map represents how the query is joining the tables in the query. Data Access Maps are covered in more detail in the following section of this article. For further clarification, the joins numbers that in the Data Access Map ( 1 and 2 ) are also indicated in the Join section of the query as noted in (*5) below. This doubling up of effort significantly improves the readability of your code, but you must take extra care to keep the two in synch. (*2.a) Code Source Indicator : The first part of the comments EMP_PKG.- validate_emp indicates where the query can be found within the many application files and program units that make up your application. In this particular case, the Code Source Indicator shows that the query is part of a a procedure within a database package. Since these comments are part of the query itself, the comments will appear within database trace files. So if someone is examing the query in the trace file, they will immediately know where to find the query in the application. Trust me on this one scanning through hundreds of files to find the source code is not a pleasant experience and this simple technique removes this unpleasant task. Please read *2.a and 2.b further notes below (*2.b) Tuning Comments The tuning comments Tuned 20-MAY-2001 SHOLLOWS indicate that this query has been tuned, and by whom and when. I am constantly seeing applications where people have put a lot of effort into tuning (usually as a late phase in development) and do not bother to indicate that this effort has been done. If you don t add tuning comments, no one will know whether the query has been tuned or not and they may SELECT /* EMP_PKG.validate_emp : Tuned 20-MAY-2001 SHOLLOWS */ (*2a & b) EMP.id employee_id (*3),EMP.salary from emp EMP (*4),dep DEP,location LOC where /* Joins */ (*5.a) EMP.dept_id = DEP.dept_id -- 1 (*6) And DEP.location_id = LOC.location_id -- 2 /* Restrictions */ (*5.b) And EMP.status = ACTIVE And EMP.end_date <= sysdate (*7.a) (*7.b) Figure 1. Select statement have to end up duplicating your tuning effort now knowing that this has already been done. Another nice feature of this Tuning Comment is that it will appear in database trace files since the comment is part of the query itself. Please read *2.a and 2.b further notes below (*2.a and 2.b further notes) Optimizer Hints If you add a database optimizer hint such as /*+ INDEX (EMP EMP_STATUS_I) */ the optimizer hint must appear in a separate comment that is placed before the Tuning Comments and Code Source Indicator Comments otherwise the database will ignore the optimizer hint! SELECT /*+ INDEX (EMP EMP_STATUS_I) */ /* EMP.FMB validate_emp etc... */ Auto-Removal of Comments Unfortunately, some client programs (including Oracle Forms) strip out all SQL comments except for optimizer hints before sending the SQL to the database. Oracle Forms does this because it believes that the decrease in network traffic and effort in parsing the query is worth the extra effort that it takes to remove the comments. So, the effort that you put into commenting may not make it to the database! As a result you cannot rely on a lack of tuning comments within the trace file to indicate that the SQL has not been tuned. Even so, it is well worth the effort 20 Juni 2001 OracleEkspert