【问题标题】:Simple PL/SQL Stored Procedure Not Functioning Properly Using Select Count(*)使用 Select Count(*) 无法正常运行的简单 PL/SQL 存储过程
【发布时间】:2016-03-28 15:14:40
【问题描述】:

我希望有人能够帮助我编写代码。

-- 如果网站 ('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;

/

【问题讨论】:

  • 您可以尝试执行SELECT * FROM PAGES ORDER BY PNAME 以确保在开始之前您知道 PAGES 表中存在什么。祝你好运。
  • 通常给您的 PL/SQL 参数和变量赋予与表列相同的名称并不是一个好主意。

标签: sql oracle stored-procedures plsql


【解决方案1】:

不要给参数命名与表中的列冲突。

当你有查询时

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

您的意思可能是“将pname 参数中的值与pages 表的pname 列中的值进行比较”。但实际上,= 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;

【讨论】:

  • 感谢大家的帮助。这就像从我的表中存在的其他东西重命名我的值参数一样简单。这立即奏效了。很棒的工作家伙!。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2011-10-12
相关资源
最近更新 更多