sql >> Databasteknik >  >> RDS >> Oracle

Hur returnerar man rader baserat på databasanvändaren och tabellens innehåll?

Baserat på din tidigare fråga och information du postade, så här förstod jag frågan:om du beviljade select på hela tabellen till vilken användare som helst, då kan den hämta alla rader från den. Du måste begränsa värdena ytterligare.

Ett alternativ - eftersom vi pratar om funktionen - är att använda case i where klausul.

Här är ett exempel.

Exempeldata:

SQL> create table rating as
  2    select 1 id, 'sys' name, 4 score from dual union all
  3    select 3,    'leo'     , 3 from dual union all
  4    select 6,    'scott'   , 5 from dual union all
  5    select 7,    'hr'      , 2 from dual;

Table created.

Funktion:

  • det accepterar användarnamn som en parameter (tänk på skiftläge! I mitt exempel är allt gemener. I ditt kanske du måste använda upper funktion eller något liknande)
  • case säger:if par_user är lika med sys , låt den hämta alla rader. Annars hämtar du bara rader vars namnkolumns värde är lika med par_user
  • returnera resultatet

Så:

SQL> create or replace function f_rating (par_user in varchar2)
  2    return number
  3  is
  4    retval number;
  5  begin
  6    select avg(score)
  7      into retval
  8      from rating
  9      where name = case when par_user = 'sys' then name
 10                        else par_user
 11                   end;
 12    return retval;
 13  end;
 14  /

Function created.

Låt oss prova det:

SQL> select f_rating('sys') rating_sys,
  2         f_rating('hr')  rating_hr
  3  from dual;

RATING_SYS  RATING_HR
---------- ----------
       3,5          2

SQL>


  1. Kommer att flytta en tabell/partition till ett annat tabellutrymme avbryta frågor som får åtkomst till nämnda tabell/partition?

  2. Fråga flera tabeller - visa Team Name baserat på Team ID

  3. Kan inte ansluta till SQLServer-databasen i Java-applikationen

  4. Kör dynamisk SQL-fråga i Oracle