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 匿名块已完成但未显示结果的主要内容,如果未能解决你的问题,请参考以下文章