PL/SQL错误:遇到符号“INSERT”
所以我试着做一个简单的程序,但是我的插入错误了,我不知道为什么。我已经创建了我的序列和tableLab1_选项卡,但还没有包括在这里。招生表和学生表都运行良好。我的错误在第18行的第一次插入中。确切错误为PLS-00103:遇到符号插入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
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语句可以正常工作。