Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.tools -> Re: Stored Procedures

Re: Stored Procedures

From: Klaus Zeuch <KZeuchnospam_at_hotmail.com>
Date: Wed, 3 Jan 2001 09:39:29 +0100
Message-ID: <92urmb$e4c$1@papyrus.erlm.siemens.de>

Sybrand already pointed to the solution: http://osi.oracle.com/~tkyte/ResultSets/index.html (sometimes a little bit slow due to technology used [pl/sql cartridge in oracle application server - if rarely used the application always has to be loaded first]; if necessary try it several times - the results are worth that effort).

Key technology: you must use a variable of type "ref cursor" as output / return-parameter. See the site mentioned above for a working example in vb.

Klaus
Jeff <jeff.cichocki_at_wgrfurniture.com> schrieb in im Newsbeitrag: 92tkj9$mm3$1_at_nnrp1.deja.com...
> In article <3A524A27.35F8CE08_at_Unforgetable.com>,
> Walter T Rejuney <BlueSax_at_Unforgetable.com> wrote:
> > Jeff wrote:
> > >
> > > I hate to sound like a rookie, but I am. I am new to the system
 and to
> > > oracle. Permissions are not a problem. The query will only return
 one
> > > row, but the others that I am working on will return more than one
> > > row. I am not familiar with cursors at all in oracle, could you
 shed
> > > some light on it for me (hopefully an example)? This procedure
 will be
> > > called from inside a VB application I am writing if that helps.
> > >
> > > In article <3A52363B.634188CC_at_Unforgetable.com>,
> > > Walter T Rejuney <BlueSax_at_Unforgetable.com> wrote:
> > > > jscichocki_at_my-deja.com wrote:
> > > >
> > > > > Trying to create the following stored procedure. Everytime I
 try to
> > > > > create it, it compiles with errors. I have validated the
 query. It
> > > > > functions perfect. I have two other procedure that are giving
 me
 the
> > > > > same grief (also select oriented as opposed to updates or
 deletes).
> > > > >
> > > > > CREATE OR REPLACE PROCEDURE CUSTOM.MY_UPS_GREETED
> > > > > (HOME_STORE IN VARCHAR2, TODAY IN VARCHAR2) AS
> > > > > BEGIN
> > > > > SELECT COUNT(EMP_CD) GREETED
> > > > > FROM CUSTOM.UPS_OPPORTUNITY
> > > > > WHERE HOME_STORE_CD = HOME_STORE
> > > > > AND UP_DATE = TODAY
> > > > > AND EMP_CD <> 'ZZZ';
> > > > > END;
> > > > >
> > > > > Thanks for your help.
> > > > >
> > > > > Sent via Deja.com
> > > > > http://www.deja.com/
> > > >
> > > > At the very minimum you need a host variable for the target of an
 INTO
> > > > clause. Otherwise the cursor has no place to put the data. You
 probably
> > > > also need some type of exception handler in case the query itself
> > > > returns more than one row.
> > > >
> > > > Beyond that, we need to know exactly what compile errors you are
 getting.
> > > > Do you have the proper permissions to create stored procedrues in
 the
> > > > CUSTOM schema? Do you have proper grants to SELECT from the
> > > > CUSTOM.UPS_OPPORTUNITY table? Is UP_DATE a varchar field where the
 date
> > > > is in a particular format? If it is a DATE field then you need to
 perform
> > > > a to_date() function on your TODAY variable and apply the
 appropriate
> > > > date mask (although this is a run-time problem, not a compile
 problem)?
> > > >
> >
> > Your stored procedure should look something like this:
> >
> > CREATE OR REPLACE PROCEDURE CUSTOM.MY_UPS_GREETED
> > (HOME_STORE IN VARCHAR2,
> > TODAY IN VARCHAR2
> > Row_Count OUT Integer) AS
> > BEGIN
> > SELECT COUNT(EMP_CD)
> > INTO Row_Count
> > FROM CUSTOM.UPS_OPPORTUNITY
> > WHERE HOME_STORE_CD = HOME_STORE
> > AND UP_DATE = TO_CHAR(TODAY,'YYYYMMDD')
> > AND EMP_CD <> 'ZZZ';
> > END;
> >
> > Of course, this assumes that the date is being passed in in YYYYMMDD
> > format - if it isn't then just adjust the mask accordingly. The caller
> > should also declare a variable large enough to hold the largest
 results.
> > If the caller is another PL/SQL procedure then you can just declare
> > something like:
> >
> > Rcount Integer(10) := 0;
> >
> > If the caller is a VB program then you'd want to declare an integer
> > paramter to receive the results.
> >
> > Personally, however, I would write the stored procedure a little
> > differently because I'm really picky about some things:
> >
> > CREATE OR REPLACE PROCEDURE CUSTOM.MY_UPS_GREETED
> > (HOME_STORE IN VARCHAR2,
> > TODAY IN VARCHAR2
> > Row_Count OUT Integer) AS
> > Greet_Count Integer(1) := 0;
> > Cursor C_Count is
> > SELECT COUNT(EMP_CD) GREETED
> > FROM CUSTOM.UPS_OPPORTUNITY
> > WHERE HOME_STORE_CD = HOME_STORE
> > AND UP_DATE = TO_CHAR(TODAY,'YYYYMMDD')
> > AND EMP_CD <> 'ZZZ';
> > BEGIN
> > For I in C_Count Loop
> > RCnt := C_Count%ROWCOUNT;
> > If RCnt > 1 Then
> > Raise Too_Many_Rows;
> > End if;
> > Greet_Count := I.GREETED;
> > End Loop;
> > If RCnt = 0 Then
> > Greet_Count := 0;
> > End if;
> > END;
> >
> > I never, ever, in over eight years of writing pl/sql use the
> > OPEN/FETCH/CLOSE syntax in PL/SQL - I always, at all times, use the
 FOR
> > loop syntax because it guarantees under all circumstances that when
 the
> > loop goes out of scoop that the cursor is closed.
> >

>

> I hate to even ask this after the post you just gave me (excellent
> info - Thank You) but, how does it change if I wanted to send back the
> entire result set, not just a count (get rid of the count all together)
> but all of the emp_cd's
>

> Thanks! You have been a temendous help.
>
>

> Sent via Deja.com
> http://www.deja.com/
Received on Wed Jan 03 2001 - 02:39:29 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US