Blog > Komentarze do wpisu
Wykorzystanie tablic w połączeniu Oracle - PowerBuilder
Dzisiaj , na prostym przykładzie pokażę w jaki sposób używać tablic jako parametrów IN - OUT procedury Oracle z poziomu PowerBuilder’a.

 

>>> ZACZYNAMY <<<

 

Dzisiaj , na prostym przykładzie pokażę w jaki sposób używać tablic jako parametrów IN - OUT procedury Oracle z poziomu PowerBuilder’a.

 

Zacznijmy od Oracla i utwórzmy testową procedurę:

 

CREATE OR REPLACE PACKAGE array_test
IS
   PROCEDURE p_test (a_array   IN     DBMS_SQL.number_table,
                     b_array   OUT    DBMS_SQL.number_table);
END array_test;

 

Typ DBMS_SQL.number_table jest zdefiniowany nastepujaco:

 

TYPE Number_Table IS TABLE OF number INDEX BY BINARY_INTEGER;
CREATE OR REPLACE PACKAGE BODY array_test
IS

   PROCEDURE p_test (a_array   IN   DBMS_SQL.number_table,
                     b_array   OUT  DBMS_SQL.number_table)
   IS
      v_numvaluecol  tnumvaluecol;
   BEGIN
      v_numvaluecol := tnumvaluecol();               --Inicjalizacja kolekcji

      --kopiujemy dane do kolekcji (tablice nie moga byc uzyte przy rzutowaniu na tablele, a kolekcje obiektow moga)
      FOR i IN a_array.FIRST() .. a_array.LAST()
      LOOP
         v_numvaluecol.EXTEND();                     --alokujemy nowy element
         v_numvaluecol(i) := tnumvalue(NULL);       --inicjalizacja
         v_numvaluecol(i).numvalue := a_array(i);
      END LOOP;

      --wyszukana, ponizsza operacja matematyczna przygotowuje nasze dane wyjsciowe
      SELECT   numvalue + 1
        BULK   COLLECT
        INTO   b_array
        FROM   TABLE (CAST (v_numvaluecol AS tnumvaluecol));
           
   END p_test;

END array_test;

 

Uwaga! Przed kompilacja powyższego kodu musimy utworzyć dwa nowe niezbędne typy danych. Nasz typ - kolekcja, musi być zdefiniowana jako typ globalny ponieważ używamy jej w zapytaniu.

 

CREATE OR REPLACE TYPE tnumvalue AS OBJECT (numvalue NUMBER);
CREATE OR REPLACE TYPE tnumvaluecol AS TABLE OF tnumvalue;

 

Ok. To Oracla mamy z głowy, przejdźmy więc do PowerBuildera W obiekcie transakcyjnym definiujemy nowa funkcje typu external:

 

SUBROUTINE array_test (long p_innumbers[], ref long p_outnumbers[]) RPCFUNC ALIAS FOR "array_test.p_test"

 

Kod poniższy pokazuje jej przykładowe użycie:

 

//Deklaracja in inicjalizacja tabel.
long ll_inarray[5] = {999, 1999, 2999, 3999, 4999}
long ll_outarray[]
long ll_i
 
//UWAGA! Konieczna jest inicjalizacja tabeli wyjsciowej.
for ll_i = 1 to 5
  ll_outarray[ll_i] = 0
next
 
sqlca.array_test(ll_inarray, ll_outarray)

 

Screeny na dole przedstawiają zawartość obu tablic przed i po wykonaniu procedury.

Przed        Po

 

I to na dziś tyle. Do następnego razu!

środa, 12 października 2011, m0rt1m3r

Related Posts Plugin for WordPress, Blogger...

Polecane wpisy

Komentarze
Gość: killserv, *.hansemerkur.de
2011/10/12 17:31:39
hi,
to dobre jest!!
a znasz
dbms_utility.comma_to_table(....);
i
a znasz dbms_utility.table_to_comma(....);?

moze to "ulatwi" dalsze operacje ;-)

pozdrowka
-
Gość: killserv, *.hansemerkur.de
2011/10/12 17:33:22
aaa
i jakiego "connectora" w pb do oracla uzywasz?
mam na mysli wersje?
ja niestety naraziemoge tylko o84 uzywac :-(
-
2011/10/12 23:20:57
Wstyd(?) sie przyznac, ale nie znalem i nie uzywalem zadnej z funkcji dbms_utility.
Sprawdze obie!
-
Gość: killserv, 85.182.240.*
2011/12/20 15:18:09
hi,

jako ze wlasnie musze te tabele stosowac u mnie to mala uwaga co do szybkosci pb.
W pb trzeba ZAWSZE tabelle "inicjalizowac od gory"
duzo szybsze jest:
for ll_i = 50 to 1 step -1
niz
for ll_i = 1 to 50
-
2011/12/20 20:03:42
Wiesz czemu jest to szybsze? Nie slyszalem nigdy o tej zasadzie.
-
Gość: killserv, 85.182.240.*
2011/12/21 13:10:28
poszukaj w google groups tam bylo dokladniej opisane ;-)

ale chodzi mniejwiecej o to ze, tak tylko raz zaklada tablice z 50 elementami i a potem tylko razy 50 przyisuje wartosc
a przy zakladaniu od dolu tworzy zawsze tylko o jeden element wiecej w tablicy i potem przypisuje, a samo zakladanie nowego elementu trwa ... ;-)
i to zakladnaie jednego elementu trwa nieproporcjonalnie(odwrotnie-proporcjonalnie czy jakos tak) dlugo do ilosci zakladanych elementow
ale to tylko jeden z takich tips co do szybkosci PB ...
kiedys musialem sporo tuningowac w jednym projekcie bo wszystko trwalo "lata" i sporo czytalem i dzieki temu ogolnie cos kolo 10 razy przyspieszylem kod :-D
do oracla tez mam pare tpis...
-
2011/12/21 23:43:11
Przetestuje i dam znac :)
-
2011/12/21 23:59:40
Teraz w sumie pracuje nad funkcjonalnoscia drill-down z raportow do okien z danymi szczegolowymi... wykonuje wiec sporo funkcj dla kazdego, nawet najmniejszego ruchu myszki. Jesli to jest szybsze nie omieszkam wykorzystac :)

Pozdro!




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time