HTML

Fejlesztési ötletek

Ebben a blogban fejlesztési ötleteket gyűjtöttem össze a gyorsabb és hatékonyabb fejlesztés érdekében

Friss topikok

Linkblog

Aggregációs függvények létrehozása Oracle-ben

2009.08.11. 10:54 Green Eagle

Sokszor előfordulhat, hogy különböző lekérdezések során aggregált adatokra van szükségünk. Erre számos beépített függvény áll rendelkezésünkre, de készíthetünk saját aggregációs függvényeket is. Az alábbiakban azt az aggregációs függvényt valósítjuk meg, amely a csoport elemeinek szorzatát számolja ki.

Maga a függvény igen egyszerű:

 

CREATE OR REPLACE FUNCTION MUL(input NUMBER) RETURN NUMBER paralell_enable
aggregate using MulNumber;
/
A fentiekből is látszik, hogy a megvalósítás lényegi része a MulNumber típusban található. Nézzük ennek specifikációját.

CREATE OR REPLACE TYPE MulNumber AS OBJECT (

     multipliedValue NUMBER

STATIC FUNCTION ODCIAggregateInitialize (mctx IN OUT MulNumber) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateIterate (self IN OUT MulNumber, value IN NUMBER) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateTerminate (self IN MulNumber, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER,

MEMBER FUNCTION ODCIAggregateMerge (self IN OUT MulNumber, ctx IN MulNumber) RETURN NUMBER

);
/

A fentiekben használt függvénynevek kötöttek. Mivel úgy definiáltuk a MUL függvényt, hogy párhuzamos végrehajtás esetén is alkalmazható, így itt meg valósítjuk az ODCIAggregateMerge függvényt is.

Nézzük a típus törzsét:

CREATE OR REPLACE TYPE BODY MulNumber IS

STATIC FUNCTION ODCIAggregateInitialize (mctx IN OUT MulNumber) RETURN NUMBER IS
     BEGIN
          mctx := MulNumber(1);
          return ODCIConst.Success;
     END;

MEMBER FUNCTION ODCIAggregateIterate (self IN OUT MulNumber, value IN NUMBER) RETURN NUMBER IS
     BEGIN
          self.multipliedValue := self.multipliedValue * value;
          return ODCIConst.Success;
     END;

MEMBER FUNCTION ODCIAggregateTerminate (self IN MulNumber, returnValue OUT NUMBER, flags IN NUMBER) RETURN NUMBER IS
     BEGIN
          returnValue := self.multipliedValue;
          return ODCIConst.Success;
     END;

MEMBER FUNCTIONS ODCIAggregateMerge (self IN OUT MulNumber, ctx2 IN MulNumber) RETURN NUMBER IS
     BEGIN
          self.multipliedValue := self.multipliedValue *
                                  ctx2.multipliedValue;
          return ODCIConst.Success;
     END;
END;
/
A fentieken jól végigkövethető az aggregáció folyamata. Az inicializálástól az iteráción keresztül a befejezésig, illetve a párhuzamos eredmények összefésüléséig.

Ez egy egyszerű példa arra, hogy hogyan lehet saját készítésű aggregációs függvényeket definiálni Oracle-ben.
 

Szólj hozzá!

Címkék: sql oracle típus függvény pl/sql aggregáció szorzat

Gombok elhelyezése az eszköztáron Microsoft Office Excel 2003 programban Visual Basic makró segítségével

2009.07.19. 17:08 Green Eagle

Felmerülhet a kérdés Excel makrók fejlesztése közben, hogy hogyan lehet felhasználó barátabbá tenni az alkalmazást. Ennek egyik eszköze lehet az eszköztáron elhelyezett gomb (CommandBarButton).

Amennyiben azt szeretnénk, hogy a saját gombjaink megjelenjenek az alkalmazás megnyitásakor a Workbook_Open() esemény lekezelésére van szükségünk. Ezt úgy tehetjük meg, hogy a Project Explorer-ben (View -> Project Explorer) jobb egér gombbal kattintunk a ThisWorkbook objektumra, és a View Code pontot választjuk. Az így megnyílt ablakba írhatjuk az alábbi kódot:

Private Sub Workbook_Open()
    <kód>
End Sub

Ez a kód akkor fog lefutni, amikor az alkalmazás megnyílik. Ide nem írhatunk közvetlen olyan utasításokat, melyekre szükségünk van, ezért azokat érdemes külön modulba elhelyeznünk, és itt csak a megfelelő metódusra hivatkoznunk.

Ebben a külön metódusban valósítjuk meg a gomb létrehozását. Ehhez létre kell hoznunk két változót az új CommandBar-nak és gombnak.

    Dim customCommandBar As CommandBar
    Dim customCommandBarButton As CommandBarButton
Mielőtt létrehoznánk az új CommandBar-t érdemes törölnünk a korábban azonos néven létrehozott CommandBar-t, ha van ilyen, különben hibát ad a program. Amennyiben nincs ilyen CommandBar, akkor ne adjunk vissza hibaüzenetet a felhasználónak, hiszen ez nem a program alapvető működését befolyásoló hiba.

    On Error Resume Next
    CommandBars("<CommandBar neve>").Delete
Hozzuk létre saját CommandBar-unkat és gombunkat:

    Set customCommandBar = CommandBars.Add("<CommandBar neve>", temporary:=True, Position:=msoBarTop)
    Set customCommandBarButton = customCommandBar.Controls.Add(msoControlButton)
Itt talán a Position attribútumot érdemes megemlíteni, mely sagítségével a fenti példában az ablak tetejére pozícionáljuk az új CommandBar-t.

Állítsuk be a gomb tulajdonságait:

    With customCommandBarButton
        .Style = msoButtonIcon
        .FaceId = <id>
        .OnAction = "<metódus neve>"
    End With

Itt adhatjuk meg, hogy a gomb ikonszerű legyen, a hozzá tartozó képet leíró id-t és annak a metódusnak a nevét, amely megvalósítja a kívánt funkciót. Az FaceId-khoz leírást az alábbi linkeken kaphatunk:

www.kebabshopblues.co.uk/2007/01/04/visual-studio-2005-tools-for-office-commandbarbutton-faceid-property/

www.faceidguide.com/category.html

Az alábbi oldalon található néhány hasznos addin-t különböző programokhoz, melyekkel könnyen megkereshetjük a nekünk kellő képet.

skp.mvps.org/faceid.htm

Az alkalmazás bezárásakor érdemes törölni a hozzáadott gombot. Ezt a fent említett módon tehetjük meg, azzal a különbséggel, hogy ezúttal a Workbook_BeforeClose(Cancel As Boolean) eseményt kell lekezelnünk.

Szólj hozzá!

Címkék: microsoft makró excel visualbasic commandbar faceid commandbarbutton

Oracle tárolt eljárások és csomagok titkosítása

2009.07.15. 10:21 Green Eagle

Szükség lehet arra, hogy a lefejlesztett tárolt eljárások és csomagok törzsét titkosítsuk, így gátolva meg azt, hogy mások könnyen hozzájuthassanak. Azért csak a törzset, mert az interfésznek kívülről is elérhetőnek kell lennie. Erre az Oracle Wrap eszközével van lehetőségünk. Mentsük el a szkriptet egy fájlba, majd adjuk ki az alábbi parancsot:

wrap iname=<elmentett fájl> oname=<új fájl>Ha megnézzük a létrehozott fájlt, akkor láthatjuk, hogy a tárolt eljárások és csomagok fejrészét változatlanul hagyja, míg a törzset kódolja.

Fontos, hogy abból a szempontból a Wrap eszköz nem kompatibilis a korábbi verzióihoz képest, hogy egy későbbi verzió által titkosított fájlt a korábbi verzióhoz tartozó adatbázis nem tud kezelni, míg fordítva ez nem okoz problémát.

Szólj hozzá!

Címkék: sql package security titkosítás oracle pl/sql wrap procedure

SQL szkript futtatása parancssorból SQL*Plus segítségével

2009.07.15. 10:08 Green Eagle

Talán többeknek lett volna már szüksége arra, hogy parancssorból futtassanak SQL szkripteket. Az alábbi leírás egy lehetőséget vázol minderre.

Ez a megoldás az SQL*Plus Oracle eszközt használja. A legegyszerűbb, ha a szkriptet elmentjük egy fájlba, és így adjuk ki az alábbi parancsot:

sqlplus <user név>/<jelszó>@<oracle sid> @<fájl neve>Figyeljünk arra, hogy amennyiben nem adunk meg kiterjesztést a fájlnak, akkor az SQL*Plus automatikusan a ".sql" kiterjesztést rendeli hozzá.

Egy másik megoldás, amikor nem egy fájlt szeretnénk futtatni. Linux alatt egy shell szkript oldhatja meg ezt a feladatot:

#!/bin/bash

sqlplus <user név>/<jelszó>@<oracle sid> <<ENDOFSQL

<szkript>

exit;

ENDOFSQL

Szólj hozzá!

Címkék: sql oracle sql*plus sqlplus

süti beállítások módosítása