2016-04-17 75 views
0

表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 

我想要写这需要的XY一个从表1的值作为程序一个论点,并给出了我最大的id_something我的name我表2。我有这样的代码:

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 

我希望你能明白我试图解释。

回答

0

你不会(也不能)指定的formal parameters的大小,例如字符串或比例的最大长度/数字的精度。如文档所述:

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

所以声明应该只是:

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

使用count作为一个列别名不是一个好主意,因为它是一个函数名称,但是你发布的游标查询看起来不错,所以如果这个别名不会混淆解析器,那么你可能在更改表名和其他细节。使用max作为变量名也会引起问题。避免标识符和变量名的保留和关键词。

希望这是一个锻炼,你可以做你在普通的SQL想什么,而无需求助于PL/SQL。

+0

谢谢,我没有在我的代码中使用'count',它只是作为一个解释,我也尝试了'VARCHAR2'没有最大长度,但我用'max'作为变量名称,这是问题所在,它现在工作正常。 –