在sql过程中编译错误

时间:2016-04-17 17:45:52

标签: sql oracle12c

表1:

id_client | XY 
--------------
01        | str1 
02        | str2 
03        | str1 

表2:

id_client | id_something
-------------------
02        | 32
02        | 48
01        | 32

表3:

id_something | name
--------------------
48           | john
32           | george

我想编写一个过程,它将table1值中的一个XY作为参数,并从table2中最常出现的name的表3中给出id_something。我有这段代码:

CREATE or REPLACE PROCEDURE myprocedure(XYvalue in VARCHAR2(100))
is
  cursor countsCursor is select id_something, count(*) count 
                          from table1 join table2 using (id_client) 
                          WHERE XY=XYvalue 
                          group by id_something;
  cnt countsCursor%ROWTYPE;
  max NUMBER;
  idMax table2.id_something%TYPE;
  maxName table3.name%TYPE;
BEGIN
  max := 0;
  open countsCursor;
  loop
    fetch countsCursor into cnt;
    exit when countsCursor%NOTFOUND;

    IF (cnt.count > max) THEN
      max := cnt.count;
      idMax := cnt.id_something;
    END IF;

  END loop;

  select name into maxName from table3 where id_something = idMax;

  if (max = 0) THEN
    dbms_output.put_line('No id found');
  else
    dbms_output.put_line('Most occured is ' || maxName || ', with count: ' || max || '.');

END;
  /

这是一个错误,它可以解决问题:

1/59           PLS-00103: Encountered the symbol "(" when expecting one of the following:

   := . ) , @ % default character
The symbol ":=" was substituted for "(" to continue.

3/71           PLS-00103: Encountered the symbol "JOIN" when expecting one of the following:

   , ; for group having intersect minus order start union where
   connect

我希望你能理解我想要解释的内容。

1 个答案:

答案 0 :(得分:0)

您没有(也不能)指定formal parameters的大小,例如字符串的最大长度或规模/ mumbers的精度。正如文档所说:

  

您声明的形式参数的数据类型。数据类型可以是受约束的子类型,但不能包含约束(例如,NUMBER(2)或VARCHAR2(20)。

所以声明应该是:

CREATE or REPLACE PROCEDURE myprocedure(XYvalue in VARCHAR2)
is
...

使用count作为列别名不是一个好主意,因为它是一个函数名称。您发布的游标查询看起来不错,因此如果该别名不会使解析器混淆,那么您可能在更改表名和其他详细信息时隐藏了该问题。使用max作为变量名称也会导致问题。避免使用标识符和变量名称的保留字和关键字。

希望这是一个练习,因为你可以在普通的SQL中做你正在尝试的事情,而不需要求助于PL / SQL。