sql >> Database teknologi >  >> RDS >> Oracle

orakelfunktion og markør ved hjælp af dynamisk tabelnavn

  • Der er ingen grund til at erklære en c1 skriv for en svagt indtastet ref-markør. Du kan bare bruge SYS_REFCURSOR type.
  • Du kan ikke blande implicitte og eksplicitte markøropkald som dette. Hvis du skal OPEN en markør, skal du FETCH fra det i en løkke, og du skal CLOSE det. Du kan ikke OPEN og CLOSE 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 brugte ROWPOS 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.



  1. Hvordan vil jeg søge efter tekst, der indeholder emojis?

  2. MySql:fjern tabelrækker afhængigt af kolonneduplikerede værdier?

  3. Opret forbindelse til flere databaser i CakePHP 3

  4. Advarsel:Kan ikke ændre header-oplysninger - headere er allerede sendt ved en fejl