PL/SQLを使用してストレージプロセスアクセスデータベースを作成する

20380 ワード

1実験目的
ストレージ・プロシージャを使用してデータベース・アプリケーションの設計を熟知しています.
2実験プラットフォームと実験ツール
KingbaseESデータベース管理システム、KingbaseES PL/SQL実行エンジン.
3実験内容及び要求
カリキュラム・データベースのストレージ・プロシージャを作成し、次の機能を完了します.
  • は離散数学の成績分布状況を統計し、すなわち各点数セグメントによって人数を統計する.
  • は任意の授業の平均成績を統計する.
  • 学生選択科目の成績を百分制から等級制(すなわちA、B、C、D、E)に変更する.
  • 要件:ソース・プログラムをコミットし、必要なコメントを識別します.プログラムが正しくコンパイルされ、実行されることを保証し、実験報告書に真剣に記入する.
    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文が間違っている愚かな方法があります.
    ストレージ・プロシージャを作成するときは、最初からすべての文を追加しないで、実行に失敗するまで、一言ずつ追加しないでください.これにより、エラー・ステートメントにすぐにナビゲートできます.