【问题标题】:'Invalid SQL Statement' when creating PL/SQL Procedure创建 PL/SQL 过程时出现“无效的 SQL 语句”
【发布时间】:2012-11-28 22:13:35
【问题描述】:

在 Oracle 数据库中,我有以下两个表:

Task (TaskID, ..., AuthorID)
Author (AuthorID, level)

Task 中的AuthorID 代表编写任务的作者。现在我写了下面的程序,应该是根据作者写的任务数量来更新level-Attribute。

CREATE OR REPLACE PROCEDURE profil_level
IS
    CURSOR c1 IS SELECT AuthorID, COUNT(AuthorID) as Total FROM Task
       GROUP BY AuthorID;
    result c1%ROWTYPE;
BEGIN
    OPEN c1;
        LOOP
        FETCH c1 INTO result;
        EXIT WHEN c1%NOTFOUND;

      IF(result.Total = 2 OR result.Total = 3) THEN
        UPDATE TABLE Author SET level = 'advanced' 
            WHERE AuthorID = result.AuthorID;
      END IF;

      IF(result.Total >= 4) THEN
        UPDATE TABLE Author SET level= 'proficient'
            WHERE AuthorID = result.AuthorID;
      END IF;
    END LOOP;
  CLOSE c1;
END;

尝试执行此语句,我收到大量错误,例如

无效的 SQL 语句

例如对于result c1%ROWTYPEFETCH c1 into result 行。另外,我收到错误

PLS-00103:在期待其中之一时遇到符号“文件结尾” 以下内容:...

BEGIN OPEN c1 行。我无法弄清楚我的代码有什么问题。我已经阅读了 Oracle 和其他站点上的教程,但在我目前看到的每个示例中,它们都使用了完全相同的语法。我是否需要更改“分隔符”(例如在 MySQL 中)?

感谢您的帮助!

【问题讨论】:

  • 如果您使用的是 SQL*Plus,您需要使用 / 终止 create table(在单行上)
  • @a_horse_with_no_name 我已经尝试过了,但没有任何区别(只是再次检查)。
  • @a_horse_with_no_name 你真的是指create table 声明还是只是一个错字而你的意思是create procedure?编辑:是的,我知道(但有些人希望我专门创建一个程序;-))
  • 抱歉,我的意思当然是create procedure。查看我发布的链接并单击构建架构。
  • @a_horse_with_no_name 很好的链接 - 谢谢!我试图用我的整个代码构建架构,但它不起作用(检查this)。我的代码一定有问题...

标签: oracle stored-procedures plsql


【解决方案1】:

我刚刚发现了问题:if 子句中的更新语句是错误的。应该是:

UPDATE Author SET level = 'advanced' 
            WHERE AuthorID = result.AuthorID;

而不是

UPDATE TABLE Author SET level = 'advanced' 
            WHERE AuthorID = result.AuthorID;

【讨论】:

  • 好答案。 :) 我是 pl/sql 的新手,你的问题和答案对我很有帮助。
  • @lv0gun9 这不是一个值得学习的编码模式。尽可能避免使用显式游标。 stackoverflow.com/questions/13658505/…
【解决方案2】:

错误 #1:LEVEL 是 PL/SQL 中的保留字

我在没有 IF 的情况下尝试了您的其余代码,它看起来不错 - 所以这个 将编译(见下文)。是的,IF 有 UPDATE TABLE - TABLE 这个词 不应该存在(错误 #2)

** 只是不要使用 LEVEL 作为列名。 **

CREATE OR REPLACE PROCEDURE profil_level
IS
    CURSOR c1 IS SELECT FIELD1, COUNT(FIELD1) AS TOTAL FROM T1
      GROUP BY FIELD1;
    result c1%ROWTYPE;
BEGIN
    OPEN c1;
        LOOP
        FETCH c1 INTO result;
        EXIT WHEN c1%NOTFOUND;


        END LOOP;
    CLOSE c1;
END;

【讨论】:

  • 我也尝试在没有 IF 的情况下编译该过程,但还是失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多