Formatting to_char(date)

SELECT TO_CHAR(SYSDATE,'dd-mm-yyyy') FROM DUAL;
20-04-2011
SELECT TO_CHAR(SYSDATE,'dd month yyyy') FROM DUAL;
20 april     2011
SELECT TO_CHAR(SYSDATE,'dd MONTH yyyy') FROM DUAL;
20 APRIL     2011

To get rid of those spaces (between Month and Year):

SELECT TO_CHAR(SYSDATE,'dd fmmonth yyyy') FROM DUAL;
20 april 2011
SELECT TO_CHAR(SYSDATE,'dd fmMONTH yyyy') FROM DUAL;
20 APRIL 2011

String naar kolommen.

Ik krijg regelmatig een hoeveelheid klantnummers binnen waarvan gevraagd wordt om daar wat gegevens bij te zoeken. Dat is geen enkel probleem, met een select * from klant where id in (1,2,3,4,5,6) heb je ze te pakken. Lastiger wordt het als je wil weten of alle waarden wel bestaande id’s zijn. Daarom stop ik de string dan ‘even’ in de volgende query, welke ik dan als inline view defineer om mee te outer joinen met de klanten tabel.  Alle id’s waar geen klant gegevens bij worden gevonden zijn dan ongeldige waardes.

SELECT REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) AS ID
FROM  (SELECT '123,234,345,456,567,678,789,890' str
       FROM dual)
CONNECT BY INSTR(str,',', 1, LEVEL-1) > 0

tomcat jasperreports setup on ubuntu 10.04 server

stappen genomen om tomcat jasperreports te installeren:

  1. installeer tomcat 6:
  2. sudo apt-get install tomcat6
  3. als de tomcat6 server nu draait (sudo service tomcat6 status), stop deze dan nu eerst.
  4. sudo service tomcat6 start
  5. omdat oracle al poort 8080 claimed, de tomcatpoort die standaard staat op 8080 wijzigen in 1997 (waarom 1997?). Pas hiervoor /var/lib/tomcat6/conf/server.xml aan (/var/lib/tomcat6/conf/ is een softlink naar /etc/tomcat6).
  6. <Connector port="8080" protocol="HTTP/1.1" <<<<<<
    connectionTimeout="20000"
    URIEncoding="UTF-8"
    redirectPort="8443" />
  7. maak symbolic links naar ojdbc drivers oracle (en niet kopieer, juk). Voer hiervoor de volgende commando’s uit in dir /usr/share/tomcat6/lib en met sudo.
  8. ln -s /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/jdbc/lib/ojdbc14.jar
    ln -s /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/jlib/orai18n.jar
  9. Van http://www.opal-consulting.de de JasperReportsIntegration-1.1.0.0.zip downloaden. Uitpakken en het bestand JasperReportsIntegration.war zoeken en die copieren naar /var/lib/tomcat6/webapps/
  10. sudo  cp JasperReportsIntegration.war /var/lib/tomcat6/webapps/
  11. Wijzig wachtwoord en jdbc connectie.
    Aanpassingen uitvoeren in /var/lib/tomcat6/conf/Catalina/localhost/JasperReportsIntegration.xml
  1. Start de tomcatserver.
  2. sudo service tomcat6 start

boolean in Oracle

En zo rijst de vraag: ‘hoe sla ik een boolean op in een Oracle tabel’. Nee create tabel xyz (abc boolean); werkt dus niet, datatype boolean wordt niet ondersteund op tabelniveau. Daarom zal een benadering van de waarheid gezocht moeten worden (of zoals gesteld ‘keep the datatype as restrictive as possible’).

Dus ben ik nu aan het uitzoeken of 1 van de volgende datatypes uit het create table statement hieraan voldoet:

create table test (bool_char char(1)    default 0 check (bool_char in ('0','1')) not null
                  ,bool_var  varchar(1) default 0 check (bool_var in ('0','1'))  not null                
                  ,bool_int  integer    default 0 check (bool_int in (0,1))      not null
                  ,bool_num  number(1)  default 0 check (bool_num in (0,1))      not null);

De integer valt al af dat is impliciet een number(38). De keuze tussen char(1) en varchar(1) is arbitrair, want identiek aan elkaar technisch gesproken. Omdat we hier nullen en enen opslaag is de number(1) variant al gauw goed. Maar in dat geval start ik zelf altijd de discussie, ik vind dat datatype number waarden bevat waarmee gerekend kan worden: select sum(bool_num) from test; zal vast een getal opleveren, maar dat is een nikszeggend getal, met booleans kan men niet rekenen. In mijn belevenis hoort men in dit geval voor char(1) (of varchar2(1)) te kiezen met de nodige constraint.

char varchar en tabel random vullen

Char or varchar2 that’s the question. Men zegt dat char sneller is dan varchar2. Maar dat klopt niet, want char is een subtype van varchar2 waarbij rechts wordt aangevuld met spaties.

Daarom maar een klein vingeroefingetje gedaan, waarbij ik een tabel maak met 2 kolommen (een char(30) en een varchar2(30) en deze tabel vervolgens vul met 1 miljoen random waarden, variërend van lengte 1 tot lengte 30. Vervolgens doe ik een querie met een zoekwaarde op de ene en vervolgens op de andere kolom. En hou de stopwatch in mijn hand. (Bij wijze van spreken, ik kijk naar de doorlooptijd in Toad).

CREATE TABLE char_test(ch CHAR(30), vc VARCHAR2(30));

TRUNCATE TABLE char_test;

DECLARE
  l_val VARCHAR2(30);
BEGIN
  FOR i IN 1..1000000
  LOOP
    l_val:= DBMS_RANDOM.STRING('A', ROUND(DBMS_RANDOM.VALUE(1,30)));
    INSERT INTO char_test
    VALUES (l_val,l_val);
  END LOOP;
END;

Daarna de volgende queries gedraaid:
SELECT * FROM char_test WHERE ch=’gHtGuiEMonFeiihbvAxdtkD’;
duurde 163 ms

SELECT * FROM char_test WHERE vc=’gHtGuiEMonFeiihbvAxdtkD’;
duurde 84 ms

Lijkt erop dat de varchar2 query toch echt wel 2 keer zo snel is.

jihaaa

Ik had gisteren de vraag goed beantwoord.

De vraag van vandaag was zo makkelijk dat ik deze 10 keer over heb gelezen of ik niet het spreekwoordelijke addertje onder het gras over het hoofd had gezien.

Ga je morgen zien dat er toch een addertje was.