Freitag, 1. November 2013

SQL dynamisch ausführen mit Bind Variablen

##################### Wert in Variable ##########################
 

PROCEDURE s_leseLetzteLfdNr ( p_i_tabelle IN VARCHAR2 )
/****************************************************************
 *  BESCHREIBUNG: Die ID des letzten Transfervorganges wird
 *  aus der Steuertabelle abgefragt.
 *
 *  PARAMETER:    p_i_tabelle IN          Tabelle, deren Daten
 *                                        transferiert werden.
 *
 *  FEHLER:        
 *                 
 *
 *  CHANGE HISTORY:
 *  Datum       Name            Beschreibung
 *  ----------  -------------- ----------------------------------
 *  ...
 **************************************************************/
IS
 
  sqlStr VARCHAR2(1000);
  g_offset NUMBER(30) := 1;

BEGIN
  -- Die letzte laufende Nummer aus der Remote-DB lesen
  --
und in der Konfigurationstabelle ablegen.
 
  sqlStr := 'SELECT max_id
               FROM remote_tabelle@remoteUser
              WHERE tabname = :get_table
                AND attribut = ''SPALTE''';
   
  DBMS_OUTPUT.PUT_LINE(sqlStr);
   
  EXECUTE immediate sqlStr INTO g_offset USING p_i_tabelle;
   
END s_leseLetzteLfdNr;



##################### Update in Tabelle ####################### 



PROCEDURE s_schreibeLetzteLfdNr ( p_i_tabelle IN VARCHAR2 )
/***************************************************************
 *  BESCHREIBUNG: Die ID des letzten Transfervorganges wird
 *  aus der Steuertabelle (remote_tabelle) abgefragt und in 
 *  der Konfigurationstabelle (config_table) festgehalten.
 *
 *  PARAMETER:    p_i_tabelle IN         
Tabelle, deren Daten
 *                                        transferiert werden.
 *
 *  FEHLER:        
 *                 
 *
 *  CHANGE HISTORY:
 *  Datum       Name            Beschreibung
 *  ----------  -------------- ------------------------------
 *  ...
 ************************************************************/
IS
 
  sqlStr VARCHAR2(1000);

BEGIN
  -- Die letzte laufende Nummer aus der Remote-DB lesen
  --
und in der Konfigurationstabelle ablegen.
 
    sqlStr := 'UPDATE config_table
                  SET max_id = (
                    SELECT max_id
                      FROM
remote_tabelle@remoteUser
                     WHERE tabname = :get_table
                        AND
attribut = ''SPALTE'')
                WHERE t_name = :get_table';
   
    DBMS_OUTPUT.PUT_LINE(sqlStr);

    EXECUTE immediate sqlStr USING p_i_tabelle, p_i_tabelle;

   
END s_schreibeLetzteLfdNr;



Dienstag, 15. Oktober 2013

Trigger-Beispiel für eine fortlaufende Änderungsnummer

1. Erzeugen einer Sequenz

CREATE SEQUENCE SEQ_AENDNR_CT_DEPT
       MINVALUE 1
       MAXVALUE 999999
   INCREMENT BY 1
     START WITH 1
         CACHE 20
       NOORDER 
       NOCYCLE
;

2. Der Trigger, der einen neuen Wert aus der Sequenz erzeugt und einfügt

CREATE OR REPLACE
TRIGGER T_SEQ_AendNr_CT_Dept
BEFORE INSERT 
ON CT_Dept  
FOR EACH ROW
DECLARE
  -- Lokale Variablen
  next_id NUMBER;
BEGIN
  SELECT SEQ_AENDNR_CT_DEPT.NEXTVAL INTO next_id
    FROM dual;
  :NEW.AENDERUNGSNUMMER := next_id;
END T_SEQ_AendNr_Fachlsperre;
/

[s.a. SQL-kurz&gut, J. Gennick, 2. Auflage 2007, S. 139, O'REILLY]