如何显示 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);
在我的代码中有一个在屏幕上显示消息的函数。但是当我开始时,我看不到结果。
我猜这条线不行。
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);