首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数一数车主拥有多少辆车

数一数车主拥有多少辆车
EN

Stack Overflow用户
提问于 2020-11-08 01:14:03
回答 3查看 96关注 0票数 0

我正在尝试学习plsql,并且被困在理解一些基本的东西上。这是我正在努力解决的一个挑战。我有两张桌子。一个是关于车主的信息,另一个是关于汽车的信息。

我想写一个匿名块,连接这两个表,并使用一个for循环,它基于注册给每个车主的汽车数量,打印每个人拥有的汽车数量。此外,我想要一个if语句,区分1辆汽车(单数)和2,3辆汽车(复数)。

表如下所示:

代码语言:javascript
复制
CREATE TABLE owners(
    id_nr VARCHAR2(13) PRIMARY KEY,
    f_name VARCHAR2(20),
    s_name VARCHAR2(20)
);
    
CREATE TABLE cars(
    reg_nr VARCHAR2(6) PRIMARY KEY,
    id_nr REFERENCES owners(pnr),
    model VARCHAR2(20),
    year NUMBER(4),
    date DATE
);

结果可能如下所示:

代码语言:javascript
复制
19380321-7799, Hans, Anderson, Owns: 1 car
19490321-7899, Mike, Erikson, Owns: 2 cars

。。。等

我知道这个问题已经回答了,但当我尝试以下内容时:

代码语言:javascript
复制
declare
    v_suffix varchar2(1);
begin
    for o in (select bilägare_pnr, fnamn, enamn,
                (select count(1) from fordon where fordon_pnr = bilägare_pnr) as bilar_ägda
                from bilägare)
    loop
        if o.pnr_fordon = 1 
            then v_suffix = 'bil'
            else v_suffix = 'bilar'
        end if;
        dbms_output.put_line(o.pnr || ', ' || o.fnamn || ', ' || o.enamn
            || ' Äger: ' || o.pnr_fordon || ' bil' || v_suffix);
    end loop;
end;
/

我得到了:

代码语言:javascript
复制
ORA-06550: line 9, column 27:
PLS-00103: Encountered the symbol "=" when expecting one of the following:

   := . ( @ % ; 

有什么建议吗?我不确定如何声明v_suffix

编辑(从下面的答案注释中复制):

更新我的代码:

代码语言:javascript
复制
declare
  cursor c_BILÄGARE is
    select fnamn,enamn,pnr
      from BILÄGARE;
begin
  for rec in c_BILÄGARE loop
    if (rec.antal>1) then
     dbms_output.put_line (rec.pnr||','|| rec.fnamn || ',' ||
                           rec.enamn || ',' || rec.antal || 'bilar');
    else
      dbms_output.put_line (rec.pnr||','|| rec.fnamn || ',' ||
                            rec.enamn || ',' || rec.antal || 'bil');
    end if;
  end loop;
end;

获取:

代码语言:javascript
复制
ORA-06550: line 9, column 9: PLS-00302: component 'ANTAL' must be declared (antal=Quantity)
EN

回答 3

Stack Overflow用户

发布于 2020-11-08 01:47:20

如上所述,您需要使用:=作为赋值操作符。您还需要在每个语句后使用分号-因此,您应该使用

代码语言:javascript
复制
then v_suffix := 'bil';

而不是

代码语言:javascript
复制
then v_suffix := 'bil'

因此,您的代码应该如下所示:

代码语言:javascript
复制
declare
    v_suffix varchar2(1);
begin
    for o in (select bilägare_pnr, fnamn, enamn,
                (select count(1)
                   from fordon
                   where fordon_pnr = bilägare_pnr) as bilar_ägda
                from bilägare)
    loop
        if o.pnr_fordon = 1 
            then v_suffix := 'bil';
            else v_suffix := 'bilar';
        end if;

        dbms_output.put_line(o.pnr || ', ' || o.fnamn || ', ' || o.enamn
            || ' Äger: ' || o.pnr_fordon || ' bil' || v_suffix);
    end loop;
end;
票数 0
EN

Stack Overflow用户

发布于 2020-11-08 03:27:48

请尝试这段代码:

代码语言:javascript
复制
begin

for rec in (select
    o.id_nr ||  ',' || o.f_name || ',' || o.s_name || ', Owns: ' || coalesce(car.cnt, 0) || ' ' || decode(car.cnt , 1, 'Car', 'Cars') as res
    from owners o
    left outer join (select id_nr, count(1) as cnt from cars group by id_nr) car on (car.id_nr = o.id_nr)) loop
   dbms_output.put_line(rec.res);
end loop;
end;

谢谢。

票数 0
EN

Stack Overflow用户

发布于 2020-11-08 11:12:56

您的代码中有多个问题,在以下代码中突出显示并修复了这些问题:

代码语言:javascript
复制
declare
    v_suffix varchar2(5); -- data length should be 5 or more
begin
    for o in (select bilägare_pnr, fnamn, enamn,
                (select count(1) from fordon where fordon_pnr = bilägare_pnr) as bilar_ägda
                from bilägare)
    loop
        if o.bilar_ägda <= 1 -- replaced it from pnr_fordon and <= is used for 0 or 1 car
            then v_suffix := 'bil'; -- := and ; is used here and in next statement
            else v_suffix := 'bilar';
        end if;
        dbms_output.put_line(o.pnr || ', ' || o.fnamn || ', ' || o.enamn
            || ' Äger: ' || o.pnr_fordon || ' bil' || v_suffix);
    end loop;
end;
/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64730362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档