简单的PL / SQL存储过程无法正常使用选择计数(*)

时间:2016-03-28 15:14:41

标签: sql oracle stored-procedures plsql

我希望有人能够帮助我处理我的代码。

- 如果网站('p01')已经存在,则此代码应检查数据库页面(pname,exit_count(number),entry_count(number))。

- 如果网站确实存在,则代码应返回DBMS消息。

- 如果它不存在,则应添加pname,exit_count = 0,entry_count = 0。

- 问题是,一旦我添加了一个网站// exec add_pages('p01'); //如果我尝试添加另一个// exec add_pages('p02'); //我收到了DBMS消息,而不是将网站添加到Pages数据库。

- 非常感谢任何帮助或建议。

- 代码必须采用以下格式,就像学校项目一样。

set serveroutput on size 1000000 format wrap

create or replace procedure add_pages (
    pname in pages.pname%type)
as
    page_name number;
begin   
select count(*) into page_name from pages
    where pages.pname = pname;
if
    page_name > 0 then
    dbms_output.put_line('This Website Already Exists!');
else 
    insert into pages values(pname, 0, 0);

end if;
end;

/

1 个答案:

答案 0 :(得分:3)

不要提供与表中的列冲突的参数名称。

如果您有查询

select count(*) 
  into page_name 
  from pages
 where pages.pname = pname;

您可能意味着“将pname参数中的值与pname表的pages列中的值进行比较”。但实际上,= pname解析为表中的列而不是同名参数。因此,您的查询最终会计算表中pname不为NULL的所有行。

您可以完全限定参数名称

select count(*) 
  into page_name 
  from pages
 where pages.pname = add_pages.pname;

但是,大多数人会采用约定来分隔参数名称,变量名称和列名称。就个人而言,我通常使用p_前缀作为参数,l_作为局部变量。但是有许多可能的命名约定可以避免错误。

create or replace procedure add_pages (
    p_pname in pages.pname%type)
as
    l_page_count number;
begin   
  select count(*) 
    into l_page_name 
    from pages
    where pages.pname = p_pname;

  if l_page_count > 0 then
    dbms_output.put_line('This Website Already Exists!');
  else 
    insert into pages values(p_pname, 0, 0);
  end if;
end;