PL/SQL 匿名块已完成但未显示结果

Posted

技术标签:

【中文标题】PL/SQL 匿名块已完成但未显示结果【英文标题】:PL/SQL anonymous block completed with no result displayed 【发布时间】:2013-11-12 04:29:46 【问题描述】:

当我执行程序时,会出现 nth,除了以下消息并且不显示任何不应出现的输出:匿名块已完成

我试过set serveroutput on size 50000,但没有任何改变。

这是我的 PL/SQL 过程,不确定我是否做得对。

CREATE OR REPLACE PROCEDURE verify AS
  empnum  NUMBER;
  empname VARCHAR2(50);
  fail EXCEPTION;
BEGIN

  SELECT employee.e#, employee.name INTO empnum, empname
    FROM employee
    JOIN driver ON driver.e# = employee.e#
    JOIN mechanic ON mechanic.e# = driver.e#
   WHERE rownum = 1;

EXCEPTION
  WHEN no_data_found THEN
    dbms_output.put_line('ok');
    RAISE fail;
END verify;
/

我正在尝试使用sql语句实现以下结果:

  SELECT employee.e#, employee.name
    FROM employee
    JOIN driver ON driver.e# = employee.e#
    JOIN mechanic ON mechanic.e# = driver.e#
   WHERE rownum = 1;

因此,如果有任何类似的记录,它将显示员工姓名和人数。如果没有找到类似的记录,它将显示ok 消息。

【问题讨论】:

你期望什么输出?假设所有三个表中都有数据并且连接关系正确,您的查询将使用任意e#name 填充两个局部变量。然后,您不会对这两个局部变量做任何事情。我也不确定在这里声明 fail 异常有什么好处。 @JustinCave 嗨,感谢您的及时回复。我已经更新了关于我想要实现什么的问题,但我不确定它是否会起作用.. 目标是在结果中显示多行吗?还是您只想显示任意一行?后者对我来说没有多大意义,但这就是您的 rownum = 1 子句所暗示的。您是否只是从书中学习 PL/SQL(在这种情况下将数据写入dbms_output 可能是合理的)?或者您是否尝试在现实世界中使用 PL/SQL(在这种情况下,取决于 dbms_output 是错误的)? @JustinCave 我实际上是在从一本书中学习。我注意到他们实际上会使用dbms_output。如果有多个相似的记录,它将显示所有这些记录。所以我想我应该删除rownum=1? 这里的“相似”是什么意思?就目前而言,您没有做任何事情来将表中的数据与任何寻找“相似”行的数据进行比较。你的意思是有一个除rownum=1之外的谓词吗? 【参考方案1】:

添加 dbms_out_put.put_line(empnum||empname); 在例外之前。 试试看/

【讨论】:

【参考方案2】:

您只是将列值选择到变量中,而不是显示它们。在 Select 语句之后使用 DBMS_OUTPUT.put_line('Empnum: '|| empnum||' Empname: '||empname);

【讨论】:

【参考方案3】:

你能指出你习惯的 FAIL 变量吗 引发异常。我们可以不使用这个变量来做到这一点。这 是参考程序。请尝试让我们知道它是否有效。谢谢

CREATE or REPLACE PROCEDURE av_sp_test(salary_var_1 in number)
AS
name_var avrajit.name%type;
salary_var avrajit.salary%type;
fail exception;
BEGIN
SELECT name,salary into name_var,salary_var from avrajit
WHERE salary=salary_var_1;
dbms_output.put_line('name is'||' '||name_var||' '||'salary is'||' '||salary_var);
EXCEPTION WHEN no_data_found THEN
dbms_output.put_line('OK');
END av_sp_test;

--------------------------------------------------

I have taken an input variable just to show diffrenet criterias.

begin
av_sp_test(1000);
end;
---------------------------------------------------
name is Sushil salary is 1000

Statement processed.

0.01 seconds
---------------------------------------------------

begin
av_sp_test(2000);
end;
---------------------------------------------------
OK

Statement processed.

0.00 seconds

【讨论】:

以上是关于PL/SQL 匿名块已完成但未显示结果的主要内容,如果未能解决你的问题,请参考以下文章

带有游标“匿名块已完成”的 PL/SQL 过程

PL/SQL 中的第一个程序

在 pl/sql 中使用嵌套循环但未显示正确的输出

如何在匿名 PL/SQL 块中自动显示所有 SQL 语句的输出

为啥在匿名 PL/SQL 块中没有立即引发异常?

PL/SQL语法简介(匿名PL/SQL块)