Donnerstag, 10. September 2015

Tabelle mittels For..Loop mit 100 Datensätzen befüllen

DECLARE
    p_EMPNO                  number(4)    := 0;
    p_ENAME                  varchar2(10) := 'Test';
    p_AENDERUNGSZEITSTEMPEL  timestamp(6) := sysdate;
    p_AENDERUNGSKENNZEICHEN  varchar2(2)  := 'I';
BEGIN
  FOR i IN 1 .. 100 LOOP
    p_EMPNO := p_EMPNO + 1;
    INSERT
      INTO CT_EMP1
      (
        EMPNO,
        ENAME,
        AENDERUNGSZEITSTEMPEL,
        AENDERUNGS_KENNZEICHEN
      )
      VALUES
      (
        p_EMPNO,
        p_ENAME,
        p_AENDERUNGSZEITSTEMPEL,
        p_AENDERUNGSKENNZEICHEN
      );
  END LOOP for_loop;
  COMMIT;

EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    raise_application_error (-20001,'Fehler beim Insert durch Schluesselverletzung.');
  WHEN OTHERS THEN
    dbms_output.put_line('Fehler beim Ausfuehren des Kommandos.');
    RAISE;
END;


Hier ein weiterer Link zur automatischen Testdatengenerierung:
https://www.besserdich.com/oracle/scripting/testdatengenerierung-zeilen-generator-row-generator-in-oracle/
 

Donnerstag, 26. März 2015

Dynamisch mit dem DBMS_SQL-Package

DECLARE
--
  v_Cursor     NUMBER;
  v_CmdString  VARCHAR2(5000);
  v_Ret        INTEGER;
--
BEGIN
--
  v_Cursor    := DBMS_SQL.OPEN_CURSOR;
  v_CmdString := 'rename EMP to emp_tmp';
  DBMS_SQL.PARSE(v_Cursor, v_CmdString, DBMS_SQL.NATIVE);
  v_Ret := DBMS_SQL.EXECUTE(v_Cursor);
  DBMS_SQL.CLOSE_CURSOR(v_Cursor);
EXCEPTION
  WHEN OTHERS THEN

    DBMS_SQL.CLOSE_CURSOR(v_Cursor);
    DBMS_OUTPUT.PUT_LINE('Fehler beim Ausfuehren des Kommandos');
    RAISE;
--
END;
/


Links

http://www.toadworld.com/products/toad-for-oracle/w/toad_for_oracle_wiki/231.dbms-sql-vs-execute-immediate.aspx
http://www.java2s.com/Tutorial/Oracle/0601__System-Packages/AnexampleofusingDBMSSQLOPENCURSOR.htm
http://www.java2s.com/Code/Oracle/System-Packages/FirstDBMSSQLExample.htm
http://docstore.mik.ua/orelly/oracle/bipack/ch02_05.htm
http://psoug.org/reference/dbms_sql.html

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