1

学生のテスト データを選択し、カーソルを使用してテーブルに挿入する次のコードを作成しました。できることは、学生ごとに 1 つのテーブルを作成し、関連データを挿入することです。これは、1 つの行または複数の行である可能性があります。

SET SERVEROUTPUT ON

CREATE OR REPLACE PROCEDURE run_student_scores 

  IS

  CURSOR c_pass_fail_cursor
    IS
  SELECT students.firstname,
      test_history.score,
      test_id.test_name,
      test_id.passing_grade
  FROM students
  INNER JOIN test_history
    ON students.student_id = test_history.student_id
  INNER JOIN test_id
    ON test_id.test_id = test_history.test_id
    WHERE test_history.start_time BETWEEN to_timestamp(sysdate) + INTERVAL '8' HOUR 
      AND to_timestamp(sysdate) + INTERVAL '21' HOUR;

v_name    students.firstname%TYPE;
v_score   test_history.score%TYPE;
v_test    varchar2(40);
v_passing test_id.passing_grade%TYPE;
v_result  varchar2(4);

BEGIN

  EXECUTE IMMEDIATE ('create table student_tests_' || (to_char(sysdate, 'yyyymmdd')) ||     '(student_name VARCHAR2(20), test_name varchar2(40), test_score NUMBER(3), pass_rate     NUMBER(3), pass_fail VARCHAR2(4))');

OPEN c_pass_fail_cursor;
 LOOP
FETCH c_pass_fail_cursor INTO v_name, v_score, v_test, v_passing;
EXIT WHEN c_pass_fail_cursor%NOTFOUND;
If v_score < v_passing 
  THEN v_result := 'Fail';
    DBMS_OUTPUT.PUT_LINE(v_name || ' ' || v_score || ' ' || v_test || ' ' || V_passing || ' ' || 'Result =' || v_result);
ELSE
  v_result := 'Pass';
  DBMS_OUTPUT.PUT_LINE(v_name || ' ' || v_score || ' ' || v_test || ' ' || V_passing || ' ' || 'Result =' || v_result);
END IF;

EXECUTE IMMEDIATE 'INSERT INTO student_tests_' || (to_char(sysdate, 'yyyymmdd')) || ' ' || ' values(:1, :2, :3, :4, :5)' using v_name, v_test, v_score, v_passing, v_result;

END LOOP;

CLOSE c_pass_fail_cursor; 

END;
/ 

ここ数日、いじってみましたが、うまくいきません。最も近いのは、テーブルを作成して最初の行のみを挿入することで、ループが既に存在するテーブルを作成しようとするとエラーが発生します。

どんな助けでも素晴らしいでしょう

ありがとう

ベン

4

2 に答える 2