Toon posts:

[oracle,delphi] voorkeur stored procedures?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een stageproject
(zie (vooral page 2) [topic=352988/1/25] )

Nu ben ik ook aan het onderzoeken of het misschien slim is om gebruik te maken stored procedures.

Ik ben een artikel tegengekomen waarbij idd de voorkeur gegeven wordt voor Stored procedures..

http://www.dba-oracle.com/art_ioug_proc.htm

Iemand ervaring dat dit inderdaad sneller gaat, of op- en aanmerkingen?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Gebruik maken van stored procedures heeft als voordeel dat je in php code geen sql meer hebt staan. Je roept eigenlijk een soort api aan.
Hiermee kan je de hele DB-structuur, met alle referantiele integriteits problematiek in de DB-leggen.

Maakt de php-code lekker simpel, maar je moet wel lekker oracle overweg kunnen. Het wordt geschreven in PL/SQL. Ik vind het heerlijk. Heb er voor KPN een geweldig systeem mee gebouwd.
Jammer genoeg konden we toen nog geen multi-row select uitvoeren in de stored procedure, maar volgens mij is dat nu geen probleem meer.

Verwijderd

Topicstarter
is wel een groot voordeel jah, het maakt het stukken taal onafhanelijk. Je hoeft dan alleen de schil eromheen te bouwen. Stukken sneller, dynamischer.
Ga nu vooral van delphi uit, maar php zou ook zo kunnen.

is Oracle 8i, dus kan jeveel mee volgens mij.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

De huidige visie van Oracle is gericht op een gescheiden applicatie en database tier.
PL/SQL (in de database) wordt dan ook uitgefaseerd.

Who is John Galt?


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Kijk dus even of je een array met records oid terug kan krijgen van een stored procedure(SP). Als dit kan, direct SP's gebruiken.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op dinsdag 18 december 2001 11:53 schreef justmental het volgende:
De huidige visie van Oracle is gericht op een gescheiden applicatie en database tier.
PL/SQL (in de database) wordt dan ook uitgefaseerd.
Wat komt daarvoor in de plaats dan.
Is dat de OO-interface op de DB of EJB?

Verwijderd

SP zijn over het algemeen veel sneller omdat dit serverside wordt uitgevoerd (client hoeft veel minder rekenwerk te verrichten) en netwerk verkeer schijnt ook af te nemen.

Bovenstaande geldt met name voor inserts/updates waarbij eerst controles/bewerkingen worden uitgevoerd op de data. Of SP's sneller zijn m.b.t. SELECT-queries weet ik niet, misschien dan toch maar views (of heb je die niet in Oracle? 'k Heb nl. alleen ervaring met SQL Server).

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 18 december 2001 11:55 schreef Goodielover het volgende:
Wat komt daarvoor in de plaats dan.
Is dat de OO-interface op de DB of EJB?
Java, java, java is wat ze nu zeggen.
En op de application server tier dus.

Who is John Galt?


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 18 december 2001 11:54 schreef Goodielover het volgende:
Kijk dus even of je een array met records oid terug kan krijgen van een stored procedure(SP). Als dit kan, direct SP's gebruiken.
Cursor.

- deze reply had eigenlijk niet geplaatst mogen worden.. iets met een ignore lijst -

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Op dinsdag 18 december 2001 12:50 schreef dusty het volgende:

[..]

Cursor.

- deze reply had eigenlijk niet geplaatst mogen worden.. iets met een ignore lijst -
Ik heb 1 keer iets gezegd wat je niet helemaal aanstond.. sorry sorry.. zet iemand op die lijst als hij herhaaldelijk foute dingen doet en ik heb 1 keer misschien beetje foute reactie, kan gebeuren..

Maar oke, in PL/SQL kan je een cursor zetten maar kan je die ook teruggegeven d.m.v. een stored procedure?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Als je de databasetransactie/select niet wilt laten openstaan is dit geen optie.
Bovendien een procedure is eindig dus hoe wil je daar een cursor in laten wachten tot het volgende record wordt gelezen.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 18 december 2001 13:23 schreef turbop het volgende:
[..]
Maar oke, in PL/SQL kan je een cursor zetten maar kan je die ook teruggegeven d.m.v. een stored procedure?
Anders had ik het niet gezegd.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 18 december 2001 13:26 schreef Goodielover het volgende:
Als je de databasetransactie/select niet wilt laten openstaan is dit geen optie.
Bovendien een procedure is eindig dus hoe wil je daar een cursor in laten wachten tot het volgende record wordt gelezen.
Niet veel ervaring met Oracle zie ik?

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
maar wat bedoel je met de cursor dan?
(ben geen oracle expert..)

Dit is dus wat ik bijv. nodig heb:

tabel klant.
|---------------
|naam | bedrag |
|---------------
|piet | 100 |
|jan | 20 |
|piet | 50 |
|piet | 40 |
----------------

en dan iets van bedragen("piet",a_bedragen)
zodat alle bedragen van piet in a_bedragen komen dus
a_bedragen=[100,50,40]

Dit kan dus met cursor.. Bedankt Dusty!.. (ik word weer beetje :Z vanmezelf.. las niet goed)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Zoek de CURSOR_TYPE eens op.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Op dinsdag 18 december 2001 13:36 schreef dusty het volgende:
Zoek de CURSOR_TYPE eens op.
Ik duik hier de Oracle Press(Osborne) Advanced PL/SQL programming boeken in!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op dinsdag 18 december 2001 13:28 schreef dusty het volgende:

[..]

Niet veel ervaring met Oracle zie ik?
Te vroeg conclusies getrokken. Ongeveer 8 jaar ervaring mt Oracle op erg hoog niveau.
Laatste jaren ontwikkelingen van Oracle niet meer precies gevolgd.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Op dinsdag 18 december 2001 13:33 schreef turbop het volgende:
maar wat bedoel je met de cursor dan?
(ben geen oracle expert..)

Dit is dus wat ik bijv. nodig heb:

tabel klant.
|---------------
|naam | bedrag |
|---------------
|piet | 100 |
|jan | 20 |
|piet | 50 |
|piet | 40 |
----------------

en dan iets van bedragen("piet",a_bedragen)
zodat alle bedragen van piet in a_bedragen komen dus
a_bedragen=[100,50,40]

Dit kan dus met cursor.. Bedankt Dusty!.. (ik word weer beetje :Z vanmezelf.. las niet goed)
Dit is absoluut geen cursor!
Dit is een array van waarden, zoals ik hierboven ook al had aangegeven.
Bij een cursor gebruik je fetch next om het volgende rec te lezen. Je gaat dus stap voor stap door je resultset heen.

Bovendien bij [100,3,40] krijg je maar 1 waarde/kolom terug.
Als je echter niet 1 waarde/kolom terug wilt maar een heel record, kon dit niet, omdat Oracle het datatype record toen niet kende, en je dus niet een array van records terug kon krijgen.
De enige mogelijkheid die je had was alle kolommen concateneren en dan in je applicatie weer uit elkaar prutsen.

Verwijderd

Topicstarter
maar je kan nu dus wel een record teruggeven..
(spreken hier mensen elkaar tegen :? of ligt het maar aan mij..) hoe kan ik dit nu doen dan, zonder abstracte kreten..
maar duidelijk iets concreet.. Goodielover spreekt dusty tegen toch?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Ik weet niet of het met de huidige mogelijkheden van Oracle kan. Hier een stappenplan:

1. Pak de manual en ga zoeken op de parametertypen van een stored procedure/fucntion.
2. Kijk of een van de types een lijst van records terug kan geven.
3. Zo ja gebruik die
4. Zo nee: een enkel record kan terug worden gegeven door de velden die terug moeten komen als in/out parameter bij de procedure te benoemen.
5. Toch meerdere records dan select's opnemen in de php op traditionele manier

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 18 december 2001 14:00 schreef Goodielover het volgende:
Ik weet niet of het met de huidige mogelijkheden van Oracle kan. Hier een stappenplan:
2. Kijk of een van de types een lijst van records terug kan geven.
Nee.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • GoeGie
  • Registratie: Juni 2001
  • Laatst online: 01-09 18:53
Eventjes een vraagje:
Welke versie van Oracle gebruik je en op welk platform ?

Verwijderd

Topicstarter
Oracle 8i Enterprise
Unix

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Het slimst is het gebruik van zgn. SQL object types.
Dit kan vanaf Oracle 8i.

Hiermee kun je stored procedures als een soort virtuele tabellen definieren.
Deze kun je dan met eenvoudige selects in je front end gebruiken.

Who is John Galt?


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 18 december 2001 14:04 schreef dusty het volgende:
Nee.
Ja -> PL/SQL table.

Who is John Galt?


Verwijderd

Topicstarter
misschien idee om nu de naam van topic te veranderen naar
Return Array(of soortgelijks) met PL/SQL procedure??

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Kijk hier voor mooie voorbeelden op dit gebied.

Who is John Galt?


  • ParaNoiMia
  • Registratie: Mei 2000
  • Laatst online: 13-09 20:19
Je kan in Oracle een REF CURSOR definieeren en daarmee records teruggeven in een recordset. Ik weet niet of dat met PHP samenwerkt, in combinatie met Visual Basic werkt het in ieder geval prima.

Net een applicatie afgerond waarbij ik de client kant in VB heb geschreven en er veel rules en procedures in de database zijn geprogrammeerd met PL/SQL.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 18 december 2001 15:05 schreef ParaNoiMia het volgende:
Ik weet niet of dat met PHP samenwerkt
Werkt prima met PHP, werkt ook prima met Delphi.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 18 december 2001 14:23 schreef justmental het volgende:
Ja -> PL/SQL table.
Kom je toch weer stiekum terug bij de cursor. ;)

Zie hier.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 18 december 2001 15:16 schreef dusty het volgende:
Kom je toch weer stiekum terug bij de cursor. ;)

Zie hier.
Wat bedoel je te zeggen?
In die (oude) docs gebruiken ze cursoren om PL/SQL tables te vullen ja.

Je kunt zowel een cursor als een PL/SQL table teruggeven uit een stored procedure.
De PL/SQL table biedt je meer functionaliteit maar is niet handig voor grote resultaatsets.
Vanaf 8i kun je ook een ref cursor definieren op een PL/SQL table en zo dus alleen de ref cursor laten teruggeven.

Who is John Galt?


Verwijderd

Topicstarter
Heb ook iets gevonden:
"Collections : PL/SQL collections are similar to arrays in other 3GLs...

NOTE: In Oracle7, index-by tables were known as PL/SQL tables. Oracle 8 PL/SQL tables includes both index-by and nested tables."

Zo'n table is dus een Collection Type

Bedankt voor alle hulp! Weet nu waar ik moet zoeken dankzij de URL's die gegeven zijn en de info van deze topic

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 18 december 2001 15:27 schreef justmental het volgende:
[...]
Je kunt zowel een cursor als een PL/SQL table teruggeven uit een stored procedure.
De PL/SQL table biedt je meer functionaliteit maar is niet handig voor grote resultaatsets.
Vanaf 8i kun je ook een ref cursor definieren op een PL/SQL table en zo dus alleen de ref cursor laten teruggeven.
Klopt, ik gebruik op het moment de ref cursor het vaakst. ( Meest flexibel voor mij )

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
zou iemand misschien kunnen toelichten wat een ref cursor is?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Op dinsdag 18 december 2001 15:46 schreef turbop het volgende:
zou iemand misschien kunnen toelichten wat een ref cursor is?
Is gewoon een soort pointer naar een cursor.
Dus een verwijzing naar waar de (geopende) cursor staat.

Who is John Galt?


Verwijderd

Op dinsdag 18 december 2001 11:52 schreef turbop het volgende:
is wel een groot voordeel jah, het maakt het stukken taal onafhanelijk. Je hoeft dan alleen de schil eromheen te bouwen. Stukken sneller, dynamischer.
Elk voordeel heeft z'n nadeel... :)
Het wordt wel minder taalafhankelijk, maar je legt je direct ook vast op Oracle. En PL/SQL is net zo SQL92 compliant als de rest, niet dus... Overschakelen naar bv. MSSQL, SyBase of InterBase betekent meestal dat je je stored procs volledig moet herschrijven.

Wanneer je meerdere DB's moet ondersteunen is een middle tier meestal 't handigst: deze handelt de DB calls af, en stuurt het resultaat naar de client. In het geval je voor een bepaalde call al een stored proc voor die DB hebt, gebruikt 'ie die, en anders doet 'ie het zelf, client side (of meer middle tier side). Voordeel is dat de middle tier dichter bij de DB te plaatsen is als de client (kan vaak zelfs op dezelfde machine als de DB draaien), en dat verlaagt je netwerk traffic aanzienlijk.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Voorbeeldje dan maar?

Spec:
code:
1
2
3
4
5
6
CREATE OR REPLACE PACKAGE myfirstpackage AS
   TYPE  CURSOR_TYPE IS REF CURSOR;
   PROCEDURE Main (
     h_currency IN mytable.currency%TYPE,
     O_RESULT_SET OUT CURSOR_TYPE
   );

Body:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE OR REPLACE PACKAGE BODY myfirstpackage AS
   PROCEDURE Main (
     h_currency IN mytable.currency%TYPE,
     O_RESULT_SET OUT CURSOR_TYPE
   )
AS
   BEGIN
     OPEN O_RESULT_SET FOR
     select
        mytable.currency
     from
        mytable
     where
        mytable.currency>0
exception when others
    then close O_RESULT_SET;       

  END;


END;

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Opmerking: je bedoelt vast > h_currency.
Vraag: Wanneer wordt de cursor gesloten als iemand deze procedure uitvoert?

Verwijderd

Topicstarter
Op dinsdag 18 december 2001 15:58 schreef Afterlife het volgende:
Elk voordeel heeft z'n nadeel... :)
Het wordt wel minder taalafhankelijk, maar je legt je direct ook vast op Oracle. En PL/SQL is net zo SQL92 compliant als de rest, niet dus... Overschakelen naar bv. MSSQL, SyBase of InterBase betekent meestal dat je je stored procs volledig moet herschrijven.
Gelukkig hebben we dat probleem niet, 900 tables(en dan heb ik het nogeens niet over de stored procedures e.d.)
gaan we echt niet omzetten naar ander DB..

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 18 december 2001 16:15 schreef Goodielover het volgende:
Opmerking: je bedoelt vast > h_currency.
Vraag: Wanneer wordt de cursor gesloten als iemand deze procedure uitvoert?
Zodra de gebruiker op het eind van de PL/SQL table komt en toch verder wilt lezen wordt er een exception gegenereerd wat dus netjes weer de cursor afsluit, of als de gebruiker zegt dat het afgesloten moet worden, of anders als de time-out van oracle toeslaat (praktisch nooit).

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Op dinsdag 18 december 2001 16:18 schreef turbop het volgende:
gaan we echt niet omzetten naar ander DB..
Vond ik ook (we hadden InterBase als DBMS), totdat een franse hotelketen met 80+ hotels met MSSQL als eis kwam, en Defensie met Oracle. Dan ga je er echt nog wel een keertje over nadenken... :)
Pagina: 1