sql >> Databáze >  >> RDS >> Oracle

funkce oracle a kurzor pomocí dynamického názvu tabulky

  • Není potřeba deklarovat c1 zadejte pro slabě napsaný referenční kurzor. Stačí použít SYS_REFCURSOR typu.
  • Nemůžete takto kombinovat implicitní a explicitní volání kurzoru. Pokud se chystáte OPEN kurzor, musíte FETCH z něj ve smyčce a musíte CLOSE to. Nemůžete OPEN a CLOSE 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žil ROWPOS 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é.



  1. TOP 5 MySQL Delete Syntax s tipy pro vývojáře T-SQL

  2. Vrácení jednotlivých hodnot null pomocí postgres tablefunc crosstab()

  3. Jak vložit více hodnot textového pole do jednoho pole s různým odlišným ID?

  4. Geo Django mac OS X