Mittwoch, 25. März 2015

SQL mal wieder ein wenig dynamischer

declare
  procedure run(p_sql varchar2) as
  begin
    execute immediate p_sql;
  end;
begin
       
 run('rename EMP to emp_tmp');
 run('rename emp_tmp to emp');

end;


Dazu noch ein paar nützliche Informationen:

http://use-the-index-luke.com/de/sql/mythen/dynamisches-sql-ist-langsam
http://www.insidesql.org/blogs/frankkalis/2004/07/16/dynamisches-sql-fluch-und-segen

Dienstag, 3. März 2015

Join über vier Tabellen

Dieses Beispiel beruht auf dem SQL - Wikipedia ER-Diagramm:
http://de.wikipedia.org/wiki/SQL#Sprachelemente_und_Beispiele

Um anzuzeigen, welche Vorlesungen die Studenten besuchen und deren zugeordnete Professoren, kann diese Abfrage verwendet werden:

select s.matrnr
     , s.name
     , v.vorlnr
     , v.titel
     , p.persnr
     , p.name
  from Student s, hoert h, Vorlesung v, Professor p
 where s.matrnr = h.matrnr
   and h.vorlnr = v.vorlnr
   and v.persnr = p.persnr
order by 2

MATRNR   NAME     VORLNR   TITEL   PERSNR   NAME
26120    Fichte   5001     ET      15       Tesla
26120    Fichte   5045     DB      12       Wirth
25403    Jonas    5001     ET      15       Tesla

Hier noch ein Beispiel zum Left Outer Join (wg. BURLESON Consulting):


http://www.dba-oracle.com/tips_oracle_left_outer_join.htm


Dienstag, 16. Dezember 2014

Dynamisch Tabellen abfragen und Datensätze zählen

set serveroutput on
--
DECLARE
  CURSOR c_trig IS
    SELECT table_name
    FROM tabs
    WHERE 1=1
      AND table_name like 'T_%'
  ;
  v_zaehler number;
BEGIN
  FOR r IN c_trig
  LOOP
--    execute immediate 'TRUNCATE TABLE '||r.table_name;
    execute immediate 'select count(*) from ' || r.table_name into v_zaehler;
    DBMS_OUTPUT.PUT_LINE(r.table_name || ' : ' || v_zaehler);
  END LOOP;
END;
/

Freitag, 28. November 2014

For-Cursor-Loop

DECLARE
  v_aenderungszeitstempel TIMESTAMP(6);
BEGIN
  FOR cur IN (select table_name
                from tabs
               where table_name     like 'CT_%'
                 and table_name not like 'CT_D_%'
                 and table_name not like 'CT_PROT_%') LOOP
    execute immediate 'SELECT max (aenderungszeitstempel) FROM ' || cur.table_name INTO v_aenderungszeitstempel;
    DBMS_OUTPUT.put_line('max Aenderungszeitstempel der Tabelle ' || cur.table_name || ':  ' || v_aenderungszeitstempel);
  END LOOP;
END;

einfache Queries

select table_name
  from tabs
 where table_name     like 'T_%'
   and table_name not like 'T_D_%'
   and table_name not like 'T_PRO_%'
 ;

Dienstag, 18. November 2014

Dynamisch SQL-Befehle generieren

select 'delete from ' || table_name || ';' from tabs;

select 'insert into ' || table_name || ' select * from ' || table_name || '@dwh;' from tabs;


select 'CREATE TABLE ' || table_name || '_S  AS (SELECT * from  ' || table_name || ');' from tabs;

Donnerstag, 24. Juli 2014

Parameterübergabe eines Perl-Scripts an SQL*Plus


/*************************************************
*           Programm: start.pl
*************************************************/

sqlplus start.sql §Tabelle§

####################################################


/*************************************************
*           Programm: start.sql
*************************************************/

PROMPT Aufruf eines SQL-Scripts mit Parameteruebergabe
exec sqlScript('&1');

####################################################


/*************************************************
*           Programm: sqlScript.sql
*************************************************/

 select * from &1;

####################################################