0

次のエラーが発生しました。DBMS_SQL について学習しています。テーブルを削除して新しいテーブルを再作成する以下のコードをいじっていました。新しいテーブルの再作成で気付きましたが、文字の制約が発生しています。これを修正するための最善の解決策は何だろうと思っています。

2 つの文字列を連結しようとしましたが、うまくいきませんでした。'CREATE TABLE students_12345(s_id NUMBER, fname VARCHAR2(30),lname VARCHAR2(30),tname VARCHAR2(100), スコア NUMBER, Exam_result VARCHAR2(6))';

それはおそらく非常に単純なことですが、コードのこの時点に到達するのに数時間かかり、この時点で私の目は四角くなっています.

前もって感謝します!

行から始まるエラー: コマンドの 48 - EXECUTE RecreateTempTable('a') エラー レポート - ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます ORA-06512: "SYS.RECREATETEMPTABLE"、33 行目ORA-06512: 1 行目 06502. 00000 - "PL/SQL: 数値または値エラー %s" *原因: 算術、数値、文字列、変換または制約エラーが発生しました。たとえば、このエラーは、NOT NULL と宣言された変数に値 NULL を代入しようとした場合、または NUMBER(2) と宣言された変数に 99 より大きい整数を代入しようとした場合に発生します。*処置: 値が制約に違反しないように、データ、操作方法または宣言方法を変更してください。

CREATE TABLE students_12345
  (student_id   NUMBER,  
   first_name   VARCHAR2(30),
   last_name    VARCHAR2(30),
   test_name    VARCHAR2(100),
   score        NUMBER,
   exam_result  VARCHAR2(6));

/
-----------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE RecreateTempTable (
    p_description IN VARCHAR2) IS

   v_descrip       VARCHAR2(100) := p_description;
   v_cursor        NUMBER;
   v_createstring  VARCHAR2(100);
   v_dropstring    VARCHAR2(100);
   v_numrows       INTEGER;
BEGIN
   v_cursor := DBMS_SQL.OPEN_CURSOR;
   v_dropstring := 'DROP TABLE students_12345';

  BEGIN
  -- parse the query using the parameter table name
    DBMS_SQL.PARSE(v_cursor, v_dropString, DBMS_SQL.NATIVE);
  -- execute the cursor query
    v_numrows := DBMS_SQL.EXECUTE(v_cursor);
  EXCEPTION
    WHEN OTHERS THEN
       IF SQLCODE != -942 THEN
         RAISE;
       END IF;
  END;

  v_createstring := 'CREATE TABLE students_12345(s_id NUMBER, fname VARCHAR2(30),lname VARCHAR2(30),tname VARCHAR2(100), score NUMBER)';
  DBMS_SQL.PARSE(v_cursor, v_createstring, DBMS_SQL.NATIVE);
  v_numrows := DBMS_SQL.EXECUTE(v_cursor);

  DBMS_SQL.CLOSE_CURSOR(v_cursor);
EXCEPTION
  WHEN OTHERS THEN
     DBMS_SQL.CLOSE_CURSOR(v_cursor);
     RAISE;
END RecreateTempTable;
  /
-------------------------------------------------------------------------------
EXECUTE RecreateTempTable('a');
4

0 に答える 0