- Der er ingen grund til at erklære en
c1
skriv for en svagt indtastet ref-markør. Du kan bare brugeSYS_REFCURSOR
type. - Du kan ikke blande implicitte og eksplicitte markøropkald som dette. Hvis du skal
OPEN
en markør, skal duFETCH
fra det i en løkke, og du skalCLOSE
det. Du kan ikkeOPEN
ogCLOSE
det, men hent derefter fra det i en implicit markørløkke. - Du bliver nødt til at erklære en variabel (eller variabler) for at hente dataene ind. Jeg erklærede en posttype og en forekomst af den post, men du kunne lige så nemt erklære to lokale variabler og
FETCH
ind i disse variabler. ROWID
er et reserveret ord, så jeg brugteROWPOS
i stedet.
Hvis du sætter det sammen, kan du skrive noget som
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.
Jeg tror, at dette giver det resultat, du forventer
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
Bemærk, at fra et effektivitetssynspunkt ville du være meget bedre stillet at skrive dette som en enkelt SQL-sætning i stedet for at åbne en markør og hente hver række fra tabellen hver gang. Hvis du er fast besluttet på at bruge en markør, vil du gerne forlade markøren, når du har fundet den række, du er interesseret i, i stedet for at fortsætte med at hente hver række fra tabellen.
Fra et kodeklarhedssynspunkt virker mange af dine variabelnavne og datatyper ret underlige. Dine parameternavne virker dårligt udvalgte - jeg ville ikke forvente model_in
at være navnet på input-tabellen, for eksempel. Erklærer en markør ved navn c2
er også problematisk, da den er meget ikke-beskrivende.