我在 Oracle 中有點新,我將撰寫一個函式,該函式可以將資料插入到 oracle SQL 中的另一個表中。
有一個成績表:
CREATE TABLE GRADE
( ID NUMBER(38,0),
SUBJECTID NUMBER(38,0),
STUDENTID NUMBER(38,0),
GRADE NUMBER(38,0))
有 AVGGRADE 表:
CREATE TABLE AVGGRADE
( ID NUMBER(38,0),
STUDENTID NUMBER(38,0),
AVG NUMBER(38,0))
我將計算成績表中成績的平均值,然后按函式將它們插入到 AVGGRADE 表中。但是我不知道怎么做。我很感激你能幫助我。
uj5u.com熱心網友回復:
我想這是出于教育目的;否則,視圖會做(如粘性位評論)。這是我的建議:
- 創建一個序列(將用于填充
avggrade.id列) - 創建一個函式來計算學生的平均成績
- 創建一個程序,該程序將呼叫該函式并將其回傳的結果插入到目標表中
像這樣的東西:
SQL> create sequence seqgrade;
Sequence created.
SQL> create or replace function f_avg_grade (par_studentid in grade.studentid%type)
2 return number
3 is
4 l_avg number;
5 begin
6 select round(avg(g.grade), 2)
7 into l_avg
8 from grade g
9 where g.studentid = par_studentid;
10
11 return l_avg;
12 end f_avg_grade;
13 /
Function created.
SQL> create or replace procedure p_avg_grade (par_studentid in grade.studentid%type)
2 is
3 begin
4 insert into avggrade (id, studentid, avg_grade)
5 values (seqgrade.nextval, par_studentid, f_avg_grade(par_studentid));
6 end;
7 /
Procedure created.
測驗:
SQL> select * From grade order by studentid;
ID SUBJECTID STUDENTID GRADE
---------- ---------- ---------- ----------
1 100 1000 2
2 101 1000 3
3 102 1000 5
4 10 2000 3
SQL> begin
2 p_avg_grade(1000);
3 end p_avg_grade;
4 /
PL/SQL procedure successfully completed.
SQL> select * from avggrade;
ID STUDENTID AVG_GRADE
---------- ---------- ----------
1 1000 3,33
SQL>
uj5u.com熱心網友回復:
如果您正在創建一個新表只是為了選擇平均成績,不建議以這種方式這樣做,那么稍后您想要更改資料時可能會產生問題并且難以管理它。
如果您的資料如此之高,您可能需要對表進行反規范化,然后您可以繼續進行。我認為在你的情況下,去規范化表是非常罕見的,因為資料可能不會達到這么多
我認為簡單的查詢可以完成這項作業
select
studentid
avg(grade) as avg_grade
from
GRADE
group by studentid
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373074.html
上一篇:是均勻分布HBCORACLEHISTOGRAME嗎?
下一篇:選擇自己運行但不在子查詢中
