PL/SQL错误:遇到符号“INSERT”

PL/SQL错误:遇到符号“INSERT”,sql,oracle,plsql,Sql,Oracle,Plsql,所以我试着做一个简单的程序,但是我的插入错误了,我不知道为什么。我已经创建了我的序列和tableLab1_选项卡,但还没有包括在这里。招生表和学生表都运行良好。我的错误在第18行的第一次插入中。确切错误为PLS-00103:遇到符号插入 DECLARE v_lname VARCHAR(20); v_id NUMBER(3); BEGIN SELECT s.last_name INTO v_lname FROM enrollment e, student s WHERE e.stu

所以我试着做一个简单的程序,但是我的插入错误了,我不知道为什么。我已经创建了我的序列和tableLab1_选项卡,但还没有包括在这里。招生表和学生表都运行良好。我的错误在第18行的第一次插入中。确切错误为PLS-00103:遇到符号插入

DECLARE
v_lname VARCHAR(20);
v_id NUMBER(3);
BEGIN
  SELECT s.last_name
  INTO v_lname
  FROM enrollment e, student s
  WHERE e.student_id = s.student_id
  AND LENGTH(s.last_name) < 9
  GROUP BY s.last_name
  HAVING COUNT(*) = ( SELECT MAX(count(student_id))
            FROM enrollment
            GROUP BY student_id);
EXCEPTION
  WHEN TOO_MANY_ROWS THEN
    v_lname := 'Multiple Names';
END;
INSERT INTO Lab1_tab                        //ERROR
   VALUES(LAB1_SEQ.NEXTVAL, v_lname);
BEGIN
      SELECT s.last_name
      INTO v_lname
      FROM enrollment e, student s
      WHERE e.student_id = s.student_id
      AND LENGTH(s.last_name) < 9
      GROUP BY s.last_name
      having count(*) = ( SELECT MIN(count(student_id))
                        FROM enrollment
                        GROUP BY student_id);
    EXCEPTION 
      WHEN TOO_MANY_ROWS THEN
        v_lname := 'Multiple Names';
    END;
    INSERT INTO Lab1_tab
       VALUES (LAB1_SEQ.NEXTVAL, v_lname);
BEGIN
      SELECT i.last_name
      INTO v_lname
      FROM instructor i, section s
      WHERE s.instructor_id = i.instructor_id
      AND i.last_name NOT LIKE '%s'
      GROUP BY i.last_name
      having count(*) = ( SELECT MIN(count(*))
                        FROM section
                        GROUP BY instructor_id );
    EXCEPTION 
      WHEN TOO_MANY_ROWS THEN
        v_lname := 'Multiple Names';
    END;
    INSERT INTO Lab1_tab
      VALUES (1, v_lname); 
BEGIN
    SELECT i.last_name
    INTO v_lname
    FROM instructor i, section s
    WHERE s.instructor_id = i.instructor_id
    AND i.last_name NOT LIKE '%s'
    GROUP BY i.last_name
    having count(*) = ( SELECT MAX(count(*))
                        FROM section
                        GROUP BY instructor_id );
EXCEPTION 
  WHEN TOO_MANY_ROWS THEN
    v_lname := 'Multiple Names';
END;
INSERT INTO Lab1_tab
    VALUES (LAB1_SEQ.NEXTVAL, v_lname);  
END;
/

在PL/SQL匿名块之后,需要有一个/字符来允许DDL语句运行

在PL/SQL匿名块之后,需要有一个/字符才能允许DDL语句运行

您似乎正在尝试执行PL/SQL匿名块,但很快就关闭了该块。也就是说,第一个端点,你可能只是想关闭try-catch块,实际上关闭了整个东西。 可能您被DECLARE搞糊涂了,它启动匿名块,但不是启动代码块——您仍然需要开始它。 试着这样做:

DECLARE
  v_lname VARCHAR(20);
  v_id NUMBER(3);
BEGIN
  BEGIN
    SELECT s.last_name
    INTO v_lname
    FROM enrollment e, student s
    WHERE e.student_id = s.student_id
    AND LENGTH(s.last_name) < 9
    GROUP BY s.last_name
    HAVING COUNT(*) = ( SELECT MAX(count(student_id))
              FROM enrollment
              GROUP BY student_id);
  EXCEPTION
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab                        //ERROR
     VALUES(LAB1_SEQ.NEXTVAL, v_lname);

  BEGIN
    SELECT s.last_name
    INTO v_lname
    FROM enrollment e, student s
    WHERE e.student_id = s.student_id
    AND LENGTH(s.last_name) < 9
    GROUP BY s.last_name
    having count(*) = ( SELECT MIN(count(student_id))
                        FROM enrollment
                        GROUP BY student_id);
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
     VALUES (LAB1_SEQ.NEXTVAL, v_lname);

  BEGIN
    SELECT i.last_name
    INTO v_lname
    FROM instructor i, section s
    WHERE s.instructor_id = i.instructor_id
    AND i.last_name NOT LIKE '%s'
    GROUP BY i.last_name
    having count(*) = ( SELECT MIN(count(*))
                        FROM section
                        GROUP BY instructor_id );
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
    VALUES (1, v_lname); 

  BEGIN
    SELECT i.last_name
    INTO v_lname
    FROM instructor i, section s
    WHERE s.instructor_id = i.instructor_id
    AND i.last_name NOT LIKE '%s'
    GROUP BY i.last_name
    having count(*) = ( SELECT MAX(count(*))
                        FROM section
                        GROUP BY instructor_id );
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
    VALUES (LAB1_SEQ.NEXTVAL, v_lname);  

END;
/
编辑:
总而言之,当你有疑问时,数一数你的开始和结束,看看数字是否相符

您似乎正在尝试执行PL/SQL匿名块,但很快就关闭了该块。也就是说,第一个端点,你可能只是想关闭try-catch块,实际上关闭了整个东西。 可能您被DECLARE搞糊涂了,它启动匿名块,但不是启动代码块——您仍然需要开始它。 试着这样做:

DECLARE
  v_lname VARCHAR(20);
  v_id NUMBER(3);
BEGIN
  BEGIN
    SELECT s.last_name
    INTO v_lname
    FROM enrollment e, student s
    WHERE e.student_id = s.student_id
    AND LENGTH(s.last_name) < 9
    GROUP BY s.last_name
    HAVING COUNT(*) = ( SELECT MAX(count(student_id))
              FROM enrollment
              GROUP BY student_id);
  EXCEPTION
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab                        //ERROR
     VALUES(LAB1_SEQ.NEXTVAL, v_lname);

  BEGIN
    SELECT s.last_name
    INTO v_lname
    FROM enrollment e, student s
    WHERE e.student_id = s.student_id
    AND LENGTH(s.last_name) < 9
    GROUP BY s.last_name
    having count(*) = ( SELECT MIN(count(student_id))
                        FROM enrollment
                        GROUP BY student_id);
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
     VALUES (LAB1_SEQ.NEXTVAL, v_lname);

  BEGIN
    SELECT i.last_name
    INTO v_lname
    FROM instructor i, section s
    WHERE s.instructor_id = i.instructor_id
    AND i.last_name NOT LIKE '%s'
    GROUP BY i.last_name
    having count(*) = ( SELECT MIN(count(*))
                        FROM section
                        GROUP BY instructor_id );
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
    VALUES (1, v_lname); 

  BEGIN
    SELECT i.last_name
    INTO v_lname
    FROM instructor i, section s
    WHERE s.instructor_id = i.instructor_id
    AND i.last_name NOT LIKE '%s'
    GROUP BY i.last_name
    having count(*) = ( SELECT MAX(count(*))
                        FROM section
                        GROUP BY instructor_id );
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
    VALUES (LAB1_SEQ.NEXTVAL, v_lname);  

END;
/
编辑:
总而言之,当你有疑问时,数一数你的开始和结束,看看数字是否相符

尝试指定插入中的列。e、 g插入Lab1_选项卡值,lastName值Lab1_SEQ.NEXTVAL,v_lname;刚刚尝试过,同样的错误也发生了尝试将INSERT放在BEGIN/ENDdustyrush中是正确的,而且问题是因为在第4行BEGIN之后缺少额外的BEGIN。请尝试指定INSERT中的列。e、 g插入Lab1_选项卡值,lastName值Lab1_SEQ.NEXTVAL,v_lname;刚刚尝试过,同样的错误也发生了尝试将您的插入放入BEGIN/ENDdustyrush是正确的,而且问题是由于在第4行BEGIN之后缺少额外的BEGIN。这不完全正确。这只是一个客户端应用程序块分隔符。它传统上用于Oracle DB客户端,因为Oracle的SQLPlus使用它作为默认PL/SQL分隔符。这是一种告诉SQLPlus您已经完成PL/SQL的方法,因此它将代码发送到Oracle DB,而不使用斜杠字符。您在技术上是正确的。最好的一种是正确的。谢谢你的澄清!不完全正确。这只是一个客户端应用程序块分隔符。它传统上用于Oracle DB客户端,因为Oracle的SQLPlus使用它作为默认PL/SQL分隔符。这是一种告诉SQLPlus您已经完成PL/SQL的方法,因此它将代码发送到Oracle DB,而不使用斜杠字符。您在技术上是正确的。最好的一种是正确的。谢谢你的澄清!添加一个解释可能会很好地插入到Lab1_选项卡值Lab1_SEQ.NEXTVAL,v_lname;如果Lab1_tab中有两列分别与值列表中的参数完全兼容的数据类型,则insert语句可以正常工作。添加解释可能有助于将insert插入Lab1_tab值LABB1_SEQ.NEXTVAL,v_lname;如果Lab1_tab有两列分别与值列表中的参数完全兼容的数据类型,则insert语句可以正常工作。