PL/SQLを使用してストレージプロセスアクセスデータベースを作成する
20380 ワード
1実験目的
ストレージ・プロシージャを使用してデータベース・アプリケーションの設計を熟知しています.
2実験プラットフォームと実験ツール
KingbaseESデータベース管理システム、KingbaseES PL/SQL実行エンジン.
3実験内容及び要求
カリキュラム・データベースのストレージ・プロシージャを作成し、次の機能を完了します.は離散数学の成績分布状況を統計し、すなわち各点数セグメントによって人数を統計する. は任意の授業の平均成績を統計する. 学生選択科目の成績を百分制から等級制(すなわちA、B、C、D、E)に変更する. 要件:ソース・プログラムをコミットし、必要なコメントを識別します.プログラムが正しくコンパイルされ、実行されることを保証し、実験報告書に真剣に記入する.
4実験手順
1.ストレージ・プロシージャの作成
a.ストレージ・プロシージャの実行後にクライアントが値を返さないため、実行後の結果を格納し、クライアント表示に戻るテーブルを作成する必要があります.実験の要求によって、「離散数学」課程を選択した学生の成績分布を統計しなければならないため、急いで表Rankを作る必要がある.
b.ストレージプロセスの作成
c.ストレージプロセスの実行
まずいくつかのデータを挿入します:カリキュラムの離散数学を挿入します:(‘8’,‘離散数学’,‘1’,‘1’)
試験のために挿入された学号は、試験のために挿入された学号が201215125~201215135の学生データであり、例を挙げる.
(‘201215125’,‘テスター’,‘男’,‘18’,‘CS’)
scテーブルの挿入:(‘201215125’,‘8’,‘59’)
ストアド・プロシージャの実行:
2.任意科目の平均成績を集計する
a.必要なテーブル構造の作成
b.ストレージ・プロシージャを作成し、avggradeテーブルの結果を実行して表示する
正常なコマンドが実行され、入力ボックスから完全にコピーされました.
3.学生選択科目の成績を百分制から等級制(A、B、C、D、E)に変更する
ストアド・プロシージャの作成と実行
5実験で発生した問題
1.ストレージ・プロシージャの実行に失敗しました:
エラー:[KingbaseES Server]ERROR:構文エラー「perform」付近Line 1 at SQL statement
修正実行文:
実行文:1.call statistic_mark(「離散数学」);
実行成功:No実行時間:86ミリ秒サーバメッセージ:[KingbaseES Server]ERROR:plsql実行失敗
修正実行文:
さっきデータを更新したときに提示されたのと同じです.二重引用符を一重引用符に変更する必要があります.(???)
前のエラーに戻りました.ストアド・プロシージャの内部実行文のエラーを示します.
説明はplsql文の内部のエラーで、デバッグ機能がなくて、コードを1つずつテストして、最後に2つの間違いを発見して、1つはkingbaseが適用しない文で、1つは変数名が間違っています.
2.ストレージプロセスエラーの削除
プロセス名のかっこを外す
いくつかの小さな穴があって、少し時間がかかりました.plsql文が間違っている愚かな方法があります.
ストレージ・プロシージャを作成するときは、最初からすべての文を追加しないで、実行に失敗するまで、一言ずつ追加しないでください.これにより、エラー・ステートメントにすぐにナビゲートできます.
ストレージ・プロシージャを使用してデータベース・アプリケーションの設計を熟知しています.
2実験プラットフォームと実験ツール
KingbaseESデータベース管理システム、KingbaseES PL/SQL実行エンジン.
3実験内容及び要求
カリキュラム・データベースのストレージ・プロシージャを作成し、次の機能を完了します.
4実験手順
1.ストレージ・プロシージャの作成
a.ストレージ・プロシージャの実行後にクライアントが値を返さないため、実行後の結果を格納し、クライアント表示に戻るテーブルを作成する必要があります.実験の要求によって、「離散数学」課程を選択した学生の成績分布を統計しなければならないため、急いで表Rankを作る必要がある.
create table rank(division char(20), number int);
b.ストレージプロセスの作成
create or replace procedure statistic_mark(name char(40))
AS
DECLARE
less60 INT :=0;
b60a70 INT :=0;
b70a80 INT :=0;
b80a90 INT :=0;
more90 INT :=0;
curcno CHAR(4);
begin
select cno INTO curcno /* */
from course
where cname = name;
SELECT count(*) INTO less60 /* 60 , less60 */
FROM SC
WHERE cno =curcno AND grade <60;
SELECT count(*) INTO b60a70 /* 60~70 , b60a70 */
FROM SC
WHERE cno =curcno AND grade >=60 AND grade<70;
SELECT count(*) INTO b70a80 /* 70~80 , b70a80 */
FROM SC
WHERE cno =curcno AND grade >=70 AND grade<80;
SELECT count(*) INTO b80a90 /* 80~90 , b80a90 */
FROM SC
WHERE cno =curcno AND grade >=80 AND grade<90;
SELECT count(*) INTO more90 /* 90 , more90 */
FROM SC
WHERE cno =curcno AND grade >=90 ;
INSERT INTO RANK VALUES('[0,60)',less60); /* Rank */
INSERT INTO RANK VALUES('[60,70)',b60a70);
INSERT INTO RANK VALUES('[70,80)',b70a80);
INSERT INTO RANK VALUES('[80,90)',b80a90);
INSERT INTO RANK VALUES('[90,100)',more90);
END;
call statistic_mark(' ')
c.ストレージプロセスの実行
まずいくつかのデータを挿入します:カリキュラムの離散数学を挿入します:(‘8’,‘離散数学’,‘1’,‘1’)
試験のために挿入された学号は、試験のために挿入された学号が201215125~201215135の学生データであり、例を挙げる.
(‘201215125’,‘テスター’,‘男’,‘18’,‘CS’)
scテーブルの挿入:(‘201215125’,‘8’,‘59’)
insert into student values('201215125', ' 1', ' ', '18', 'CS');
insert into student values('201215126', ' 2', ' ', '18', 'CS');
insert into student values('201215127', ' 3', ' ', '18', 'CS');
insert into student values('201215128', ' 4', ' ', '18', 'CS');
insert into student values('201215129', ' 5', ' ', '18', 'CS');
insert into student values('201215130', ' 6', ' ', '18', 'CS');
insert into student values('201215131', ' 7', ' ', '18', 'CS');
insert into student values('201215132', ' 8', ' ', '18', 'CS');
insert into student values('201215133', ' 9', ' ', '18', 'CS');
insert into student values('201215134', ' 10', ' ', '18', 'CS');
insert into student values('201215135', ' 11', ' ', '18', 'CS');
insert into course values('8', ' ', '1', '1');
insert into sc values('201215125', '8', '51');
insert into sc values('201215126', '8', '61');
insert into sc values('201215127', '8', '62');
insert into sc values('201215128', '8', '71');
insert into sc values('201215129', '8', '72');
insert into sc values('201215130', '8', '73');
insert into sc values('201215131', '8', '81');
insert into sc values('201215132', '8', '82');
insert into sc values('201215133', '8', '83');
insert into sc values('201215134', '8', '84');
insert into sc values('201215135', '8', '90');
ストアド・プロシージャの実行:
call statistic_mark(' ');
select* from rank;
2.任意科目の平均成績を集計する
a.必要なテーブル構造の作成
create table avggrade(
cname char(40),
avg numeric(10,6));
b.ストレージ・プロシージャを作成し、avggradeテーブルの結果を実行して表示する
正常なコマンドが実行され、入力ボックスから完全にコピーされました.
create or replace procedure collect_avg()
as
declare /* */
curname char(40);
curcno char(4);
curavgg numeric(10,6);
cursor mycursor for /* mycursor */
select cno,cname from course;
begin
open mycursor;
LOOP /* */
FETCH mycursor INTO curcno,curname; /* */
EXIT WHEN(mycursor%NOTFOUND); /* , */
SELECT AVG(grade)INTO curavgg FROM SC /* */
WHERE cno = curcno;
/* avggrade , */
insert INTO avggrade VALUES(curname,curavgg);
END LOOP;
END;
delete from avggrade;
call collect_avg();
select * from avggrade;
3.学生選択科目の成績を百分制から等級制(A、B、C、D、E)に変更する
ストアド・プロシージャの作成と実行
create or replace procedure change_critical()
AS
DECLARE
chgrade CHAR(1);
currecord record;
cursno char(9);
curcno char(4);
curgrade smallint;
BEGIN
/*ALTER TABLE SC ADD COLUMN(newgrade CHAR(1));*/ /* */
FOR cursno,curcno,curgrade in
(select sno,cno,grade from sc)
loop
IF curgrade<60 then
chgrade ='E';
ELSIF curgrade<70 then
chgrade ='D';
ELSIF curgrade<80 then
chgrade ='C';
ELSIF curgrade<90 then
chgrade ='B';
ELSE
chgrade ='A';
END IF;
update sc
set newgrade = chgrade
where sno = cursno and cno = curcno;
end loop;
/* ALTER TABLE SC DROP COLUMN grade; */ /* */
/* ALTER TABLE SC RENAME newgrade TO grade1; *//*kingbase */
END;
call change_critical;
select * from sc;
5実験で発生した問題
1.ストレージ・プロシージャの実行に失敗しました:
perform procedure statistic_mark(' ');
の実行エラー:[KingbaseES Server]ERROR:構文エラー「perform」付近Line 1 at SQL statement
修正実行文:
call statistic_mark(' ');
次のエラーが発生しました.実行文:1.call statistic_mark(「離散数学」);
実行成功:No実行時間:86ミリ秒サーバメッセージ:[KingbaseES Server]ERROR:plsql実行失敗
修正実行文:
call statistic_mark(" ");
エラー:[KingbaseES Server]ERROR:列「離散数学」にLine 1 at SQL statementは存在しませんさっきデータを更新したときに提示されたのと同じです.二重引用符を一重引用符に変更する必要があります.(???)
前のエラーに戻りました.ストアド・プロシージャの内部実行文のエラーを示します.
説明はplsql文の内部のエラーで、デバッグ機能がなくて、コードを1つずつテストして、最後に2つの間違いを発見して、1つはkingbaseが適用しない文で、1つは変数名が間違っています.
2.ストレージプロセスエラーの削除
プロセス名のかっこを外す
drop procedure STATISTIC_MARK;
6実験まとめいくつかの小さな穴があって、少し時間がかかりました.plsql文が間違っている愚かな方法があります.
ストレージ・プロシージャを作成するときは、最初からすべての文を追加しないで、実行に失敗するまで、一言ずつ追加しないでください.これにより、エラー・ステートメントにすぐにナビゲートできます.