如何显示 Oracle 程序的结果?

How do I display the result of the procedure Oracle?

在我的代码中有一个在屏幕上显示消息的函数。但是当我开始时,我看不到结果。

我猜这条线不行。

UPDATE EMPLOYEES SET COMMISSION_PCT = NEWCOMMISSION WHERE LINES.COMMISSION_PCT IS NULL;

是吗?

我使用的是 Oracle XE 112,我使用的是浏览器。

完整代码

CREATE OR replace PROCEDURE Zadacha31
IS
  lengthphone      INTEGER;
  substrcommission VARCHAR2(50);
  newcommission    FLOAT;
  info             FLOAT;
  CURSOR get_data IS
    SELECT *
    FROM   employees;
BEGIN
    FOR lines IN get_data LOOP
        IF lines.commission_pct IS NULL THEN
          lengthphone := Length(lines.phone_number);

          substrcommission := Substr(lines.phone_number, lengthphone - 1, 2);

          newcommission := To_number('.'
                                     ||substrcommission);

          UPDATE employees
          SET    commission_pct = newcommission
          WHERE  lines.commission_pct IS NULL;

          dbms_output.Put_line(lines.commission_pct);
        END IF;
    END LOOP;
END;  

尝试在运行程序

之前执行set serveroutput on

这是 SQL*Plus:

中的样子
SQL> CREATE OR replace PROCEDURE Zadacha31
  2  IS
  3    lengthphone      INTEGER;
  4    substrcommission VARCHAR2(50);
  5    newcommission    FLOAT;
  6    info             FLOAT;
  7    CURSOR get_data IS
  8      SELECT *
  9      FROM   employees;
 10  BEGIN
 11      dbms_output.put_line('Procedure starts here');
 12      FOR lines IN get_data LOOP
 13          IF lines.commission_pct IS NULL THEN
 14            dbms_output.put_line('commision_pct IS NOT NULL!');
 15
 16            lengthphone := Length(lines.phone_number);
 17
 18            substrcommission := Substr(lines.phone_number, lengthphone - 1, 2);
 19
 20            newcommission := To_number('.'
 21                                       ||substrcommission);
 22
 23            UPDATE employees
 24            SET    commission_pct = newcommission
 25            WHERE  lines.commission_pct IS NULL;
 26
 27            dbms_output.Put_line(lines.commission_pct);
 28          END IF;
 29      END LOOP;
 30      dbms_output.put_line('Procedure ends here');
 31  END;
 32  /

Procedure created.

SQL>
SQL> set serveroutput on
SQL>
SQL> begin
  2    zadacha31;
  3  end;
  4  /
Procedure starts here
Procedure ends here

PL/SQL procedure successfully completed.

SQL>

程序似乎已正确完成,但是 - 没有显示或更新任何内容。让我们检查一下原因:

SQL> select count(*) from employees where commission_pct is null;

  COUNT(*)
----------
         0

SQL>

它响铃了吗?

就您的环境而言:它看起来像 Apex 的 SQL Workshop,而您使用的数据包含在 HR 模式中。如果是这样,那么你是对的 - 你不需要 SET SERVEROUTPUT ON 那里,默认情况下它是启用的。

不过,这不是你的问题,而是没有员工 COMMISSION_PCT IS NULL

看来你的逻辑有问题。

考虑一下。仅当此测试为真时才执行更新:

IF lines.commission_pct IS NULL THEN

您的代码计算新佣金并更新所有记录(提示:这可能不是您想要的,但与您的问题无关)。

UPDATE employees
SET    commission_pct = newcommission
WHERE  lines.commission_pct IS NULL;

但是,您的输出显示的是未经修改的原始值,没有其他任何内容。

dbms_output.Put_line(lines.commission_pct);

因此您的程序很可能正在更新和显示某些内容,但它所显示的只是一个 NULL,因此看起来好像什么都没有发生。

要解决此问题,请使用新值:

dbms_output.Put_line('new commission = ' ||newcommission);

要解决更新所有记录的问题,请使用更好的 where 条件:

UPDATE employees e
SET    e.commission_pct = newcommission
WHERE  e.emp_id = lines.emp_id; -- or whatever the PK is

为什么不让输出消息更有用呢?

dbms_output.Put_line('emp# '||  lines.emp_id||' new commission = ' ||newcommission);