logo
Sonntag 5. September 2010
Zurück zur Kategorie

Insert-Prozedur

Beitrag geschrieben von PriHost am 2007-11-29

Kurzbeschreibung:
Beispielcode zum erstellen einer gespeicherten Prozedur zum einfügen eines Datensatzes in eine Tabelle.
Hier soll die Prozedur mit dem Namen "INS_item" erstellt werden, welche eine Datensatz in die Tabelle "ITEM".

Inserts über Prozeduren zu erstellen ermöglicht das Überprüfen der übergebenen Parametern direkt in der Datenbank. Diese ist schneller als wenn ich Sicherheitüberprüfungen in der Software vornehme und dadurch extra auf die Datenbank zugreifen muss.


Code:
CREATE OR REPLACE PROCEDURE INS_item (
  p_CategoryId        IN INT,
  p_TypeId        IN INT,
  p_UserId        IN INT,
    
  p_Name                 IN VARCHAR2,
  p_Description          IN VARCHAR2 DEFAULT NULL,
  p_Link                   IN VARCHAR2 DEFAULT NULL,
  p_Content             IN LONG DEFAULT NULL,
  p_InsertDateTime    IN DATE DEFAULT NULL,
  p_Image                IN BLOB DEFAULT NULL,
  p_ImageLink           IN VARCHAR2 DEFAULT NULL,
  
  p_SP_Help        CHAR DEFAULT '0',
  p_Error                  OUT VARCHAR2
)

AS

v_Help varchar2(1000);
v_ObjCount int;
v_InsertDateTime DATE;

BEGIN

-- *********************************************************************
--    Prozedur zum einfügen eines Datensatzes in die Tabelle item
--
--    erstellt von: Manuel Münch
--    Datum: 29.11.2007
--    Version: 1.0
-- *********************************************************************

p_Error := '';
v_Help := 'Prozedure zur Füllen der Tabelle item.';

-- IF p_SP_Help > 0 THEN
--    OPEN p_OUT_CC FOR
--    SELECT * FROM v_Help;
--    RETURN;
--END IF;


SELECT COUNT(1) INTO v_ObjCount  FROM All_objects WHERE owner = 'PRIHOST' AND Object_Name = 'ITEM';

IF v_ObjCount = 0
THEN
     p_Error :=  'Die Tabelle item existiert nicht.';
    RETURN;
END IF ;

v_ObjCount := 0;

SELECT COUNT(1) INTO v_ObjCount  FROM ITEM_CATEGORY WHERE CategoryId=p_CategoryId;

IF v_ObjCount = 0
THEN
     p_Error :=  'Die Kategory existiert nicht.';
    RETURN;
END IF ;

v_ObjCount := 0;

SELECT COUNT(1) INTO v_ObjCount  FROM ITEM_TYPE WHERE TypeId=p_TypeId;

IF v_ObjCount = 0
THEN
     p_Error :=  'Der Type existiert nicht.';
    RETURN;
END IF ;

v_ObjCount := 0;

SELECT COUNT(1) INTO v_ObjCount  FROM "USER" WHERE UserId=p_UserId;

IF v_ObjCount = 0
THEN
     p_Error :=  'Der User existiert nicht.';
    RETURN;
END IF ;


v_InsertDateTime := Nvl(p_InsertDateTime,SYSDATE());


INSERT INTO ITEM (
ItemId,
CategoryId,
TypeId,
UserId,
Name,
Description,
Link,
Content,
InsertDateTime,
Image,
ImageLink
) VALUES (
PRIHOST.ITEM_SQ_ITEM.NEXTVAL,
p_CategoryId,
p_TypeId,
p_UserId,
p_Name,
p_Description,
p_Link,
p_Content,
v_InsertDateTime,
p_Image,
p_ImageLink
);

COMMIT;

EXCEPTION
WHEN OTHERS THEN
  BEGIN
    ROLLBACK;
    p_Error := 'INS_item: Es ist ein Fehler aufgetreten - '||SQLCODE||' -ERROR- '||SQLERRM;
    END ;

END INS_item;


Wenn ein Fehler auftritt wird die Error-Ausgabe in p_Error geschrieben und die Prozedur abgebrochen. Dabei wird der Fehler p_Error ausgegeben.

p_CategoryId, p_TypeId usw. sind übergabeparameter, die von der Software übergeben werden.

p_Error OUT VARCHAR2 => OUT zeigt, das es sich um ein Ausgabeparameter handelt.

v_Help, v_ObjCount , usw. sind Variablen die in der Prozedur Deklariert werden.

PRIHOST.ITEM_SQ_ITEM.NEXTVAL => gibt den nächsten PrimaryKey

Der Block:
Code:
EXCEPTION
WHEN OTHERS THEN
  BEGIN
    ROLLBACK;
    p_Error := 'INS_item: Es ist ein Fehler aufgetreten - '||SQLCODE||' -ERROR- '||SQLERRM;
    END ;


Exception's tauchen auf, wenn ein Fehler auftaucht. In diesem Fall wird der Fehler in die Variable p_Error geschrieben und ausgegeben bzw. an die Software übergeben.
Um einen Beitrag zu bewerten musst du eingeloggt sein.