【问题标题】:PL/SQL anonymous block completed with no result displayedPL/SQL 匿名块已完成但未显示结果
【发布时间】: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之外的谓词吗?

标签: oracle stored-procedures plsql


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 2014-09-30
        • 1970-01-01
        • 2017-09-02
        • 2021-10-14
        • 2011-09-21
        • 2011-07-03
        相关资源
        最近更新 更多