ANSI SQL

NAVIGATION
CATEGORIES
REFERRENCE
LINKS
  • cursor is having no rows but should show at least 2

    3 answers - 2519 bytes - related search similar search Add To My Delicious Add To My Stumble Upon Add To My Google Mark Add To My Facebook Add To My Digg Add To My Reddit

    hi,

    habe build a package and a function to concat rows to a single column.

    at least, if I run the select statement nativly I retrieve zwo rows
    but calling it within a select statement
    select denorm_pkg.GetNetz (id_plan, id_knoten) netzd from knoten where id_plan= 0 and id_knoten = 122
    the column netzd is showing no values

    does anybody have a hint what might cause to problem

    (select conut(*) from knoten k , netzwerkdienst n , knoten_netzwerkdienste kn where k.id_knoten = kn.id_knoten and
    n.id_netzwerkdienst = kn.id_netzwerkdienst
    and k.id_plan = kn.ip_plan is showing 2 rows)

    table netzwerkdienst (id_netzwerkdienst number pk, name varchar(32))
    intersection table knoten_netzwerkdienst (id_plan, id_knoten, id_netzwerkdienst) all number
    table knoten (id_plan number , id_knoten number, name varchar(32) ...)

    thanks


    create or replace PACKAGE denorm_PKG IS

    /*
    Denormatlisierung der Knoten fuer itmasterplan

    */
    FUNCTION GetNetz (ix_knoten IN knoten.id_knoten%TYPE,
    ix_plan IN knoten.id_plan%TYPE) RETURN Varchar2 ;

    END denorm_PKG;
    /

    create or replace PACKAGE BODY DENORM_PKG AS

    /*

    */
    FUNCTION GetNetz (ix_knoten IN knoten.id_knoten%TYPE,
    ix_plan IN knoten.id_plan%TYPE) RETURN VARCHAR2

    IS

    -- Cursor fr die Datenbankabfrage
    CURSOR netzcrs (ix_knoten knoten.id_knoten%TYPE,
    ix_plan knoten.id_plan%TYPE) IS
    select n.netzwerkdienst
    from netzwerkdienst n, knoten_netzwerkdienste kn

    where n.id_netzwerkdienst = kn.id_netzwerkdienst

    and kn.id_plan = ix_plan
    and kn.id_knoten = ix_knoten;

    tmpVar varchar2(255);

    netz_rec netzcrs%ROWTYPE;
    BEGIN
    tmpVar := NULL;

    IF NOT netzcrs%ISOPEN
    THEN
    OPEN netzcrs( ix_knoten, ix_plan);
    END IF;

    FETCH netzcrs INTO netz_rec;
    -- Schleife ber alle Resultdatenstze, konkateniert alle
    netzwerkdienste
    WHILE (netzcrs%FOUND)
    LOOP
    IF tmpVar IS NULL
    THEN
    tmpVar := netz_rec.netzwerkdienst;
    ELSE
    tmpVar := tmpVar ||','|| netz_rec.netzwerkdienst;

    END IF;
    FETCH netzcrs INTO netz_rec;
    END LOOP;

    CLOSE netzcrs;

    RETURN tmpVar;
    END GetNetz;

    END DENORM_PKG;
    /
  • No.1 | | 168 bytes | |

    sorry folks for the disruption

    have got it my fault were the direction of the parameters

    first id_knoten next id_plan instead if id_plan, id_knoten
  • No.2 | | 2207 bytes | |

    I can't see what your problem is. What do you get for:

    select n.netzwerkdienst
    from netzwerkdienst n, knoten_netzwerkdienste kn
    where n.id_netzwerkdienst = kn.id_netzwerkdienst
    and kn.id_plan = 0
    and kn.id_knoten = 122;

    ?

    While looking at it I simplified your function code to:

    FUNCTION GetNetz (ix_knoten IN knoten.id_knoten%TYPE,
    ix_plan IN knoten.id_plan%TYPE) RETURN VARCHAR2

    IS

    -- Cursor fr die Datenbankabfrage
    CURSOR netzcrs (ix_knoten knoten.id_knoten%TYPE,
    ix_plan knoten.id_plan%TYPE) IS
    select n.netzwerkdienst
    from netzwerkdienst n, knoten_netzwerkdienste kn
    where n.id_netzwerkdienst = kn.id_netzwerkdienst
    and kn.id_plan = ix_plan
    and kn.id_knoten = ix_knoten;

    tmpVar varchar2(255);

    BEGIN

    -- Schleife ber alle Resultdatenstze, konkateniert alle netzwerkdienste
    FOR netz_rec IN netzcrs( ix_knoten, ix_plan)
    LOOP
    IF tmpVar IS NULL
    THEN
    tmpVar := netz_rec.netzwerkdienst;
    ELSE
    tmpVar := tmpVar ||','|| netz_rec.netzwerkdienst;
    END IF;
    END LOOP;

    RETURN tmpVar;
    END GetNetz;

    Or to take it further:

    FUNCTION GetNetz (ix_knoten IN knoten.id_knoten%TYPE,
    ix_plan IN knoten.id_plan%TYPE) RETURN VARCHAR2

    IS

    tmpVar varchar2(255);

    BEGIN

    -- Schleife ber alle Resultdatenstze, konkateniert alle netzwerkdienste
    FOR netz_rec IN
    ( select n.netzwerkdienst
    from netzwerkdienst n, knoten_netzwerkdienste kn
    where n.id_netzwerkdienst = kn.id_netzwerkdienst
    and kn.id_plan = ix_plan
    and kn.id_knoten = ix_knoten
    )
    LOOP
    IF tmpVar IS NULL
    THEN
    tmpVar := netz_rec.netzwerkdienst;
    ELSE
    tmpVar := tmpVar ||','|| netz_rec.netzwerkdienst;
    END IF;
    END LOOP;

    RETURN tmpVar;
    END GetNetz;
  • No.3 | | 2537 bytes | |

    only for a better understanding and another appologize

    I' ve defined the function getnetz ((ix_knoten IN knoten.id_knoten%TYPE, ix_plan IN knoten.id_plan%TYPE)

    but called it getnetz (ip_plan, ip_knoten) ...

    sorry but it realy was my fault



    Originally posted by andrewst
    I can't see what your problem is. What do you get for:

    select n.netzwerkdienst
    from netzwerkdienst n, knoten_netzwerkdienste kn
    where n.id_netzwerkdienst = kn.id_netzwerkdienst
    and kn.id_plan = 0
    and kn.id_knoten = 122;

    ?

    While looking at it I simplified your function code to:

    FUNCTION GetNetz (ix_knoten IN knoten.id_knoten%TYPE,
    ix_plan IN knoten.id_plan%TYPE) RETURN VARCHAR2

    IS

    -- Cursor fr die Datenbankabfrage
    CURSOR netzcrs (ix_knoten knoten.id_knoten%TYPE,
    ix_plan knoten.id_plan%TYPE) IS
    select n.netzwerkdienst
    from netzwerkdienst n, knoten_netzwerkdienste kn
    where n.id_netzwerkdienst = kn.id_netzwerkdienst
    and kn.id_plan = ix_plan
    and kn.id_knoten = ix_knoten;

    tmpVar varchar2(255);

    BEGIN

    -- Schleife ber alle Resultdatenstze, konkateniert alle netzwerkdienste
    FOR netz_rec IN netzcrs( ix_knoten, ix_plan)
    LOOP
    IF tmpVar IS NULL
    THEN
    tmpVar := netz_rec.netzwerkdienst;
    ELSE
    tmpVar := tmpVar ||','|| netz_rec.netzwerkdienst;
    END IF;
    END LOOP;

    RETURN tmpVar;
    END GetNetz;

    Or to take it further:

    FUNCTION GetNetz (ix_knoten IN knoten.id_knoten%TYPE,
    ix_plan IN knoten.id_plan%TYPE) RETURN VARCHAR2

    IS

    tmpVar varchar2(255);

    BEGIN

    -- Schleife ber alle Resultdatenstze, konkateniert alle netzwerkdienste
    FOR netz_rec IN
    ( select n.netzwerkdienst
    from netzwerkdienst n, knoten_netzwerkdienste kn
    where n.id_netzwerkdienst = kn.id_netzwerkdienst
    and kn.id_plan = ix_plan
    and kn.id_knoten = ix_knoten
    )
    LOOP
    IF tmpVar IS NULL
    THEN
    tmpVar := netz_rec.netzwerkdienst;
    ELSE
    tmpVar := tmpVar ||','|| netz_rec.netzwerkdienst;
    END IF;
    END LOOP;

    RETURN tmpVar;
    END GetNetz;

Re: cursor is having no rows but should show at least 2


max 4000 letters.
Your nickname that display:
In order to stop the spam: 6 + 5 =
QUESTION ON "ANSI SQL"

DATABASE TECH