- Není potřeba deklarovat
c1
zadejte pro slabě napsaný referenční kurzor. Stačí použítSYS_REFCURSOR
typu. - Nemůžete takto kombinovat implicitní a explicitní volání kurzoru. Pokud se chystáte
OPEN
kurzor, musíteFETCH
z něj ve smyčce a musíteCLOSE
to. NemůžeteOPEN
aCLOSE
ale pak se z něj načte v implicitní smyčce kurzoru. - Budete muset deklarovat proměnnou (nebo proměnné), do kterých se budou načítat data. Deklaroval jsem typ záznamu a instanci tohoto záznamu, ale stejně tak jste mohli deklarovat dvě lokální proměnné a
FETCH
do těchto proměnných. ROWID
je vyhrazené slovo, takže jsem použilROWPOS
místo toho.
Když to dáte dohromady, můžete napsat něco jako
SQL> ed
Wrote file afiedt.buf
1 CREATE OR REPLACE Function Findposition (
2 model_in IN varchar2,
3 model_id IN number)
4 RETURN number
5 IS
6 cnumber number;
7 c2 sys_refcursor;
8 type result_rec is record (
9 id number,
10 rowpos number
11 );
12 l_result_rec result_rec;
13 BEGIN
14 open c2 FOR 'SELECT id,ROW_NUMBER() OVER ( ORDER BY id) AS rowpos FROM '||model_in;
15 loop
16 fetch c2 into l_result_rec;
17 exit when c2%notfound;
18 IF l_result_rec.id=model_id
19 then
20 cnumber :=l_result_rec.rowpos;
21 end if;
22 END LOOP;
23 close c2;
24 RETURN cnumber;
25* END;
SQL> /
Function created.
Věřím, že to vrátí výsledek, který očekáváte
SQL> create table foo( id number );
Table created.
SQL> insert into foo
2 select level * 2
3 from dual
4 connect by level <= 10;
10 rows created.
SQL> select findposition( 'FOO', 8 )
2 from dual;
FINDPOSITION('FOO',8)
---------------------
4
Všimněte si, že z hlediska efektivity by bylo mnohem lepší napsat to jako jeden příkaz SQL, než otevírat kurzor a pokaždé načítat každý řádek z tabulky. Pokud jste rozhodnuti použít kurzor, měli byste raději kurzor opustit, když najdete řádek, který vás zajímá, než pokračovat v načítání všech řádků z tabulky.
Z hlediska srozumitelnosti kódu se mnoho názvů proměnných a datových typů zdá poněkud zvláštní. Názvy vašich parametrů se zdají špatně zvolené-- Neočekával bych model_in
například název vstupní tabulky. Deklarace kurzoru s názvem c2
je také problematické, protože je velmi nepopisné.