【问题标题】:How do I display the result of the procedure Oracle?如何显示过程 Oracle 的结果?
【发布时间】:2018-07-14 11:40:26
【问题描述】:

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

我猜这条线行不通。

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
  • @KaushikNayak 我将这个过程称为BEGIN ZADACHA31(); END; 我从未做过SET SERVEROUTPUT ON,但PUT_LINE 有效。现在我想在 BEGIN 之前输入 SET SERVEROUTPUT ON,但出现错误 - ORA-00922: missing or invalid option

标签: oracle stored-procedures oracle-xe


【解决方案1】:

在运行程序之前尝试执行set serveroutput on

【讨论】:

    【解决方案2】:

    您的逻辑似乎有错误。

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

    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 SET WHERE 子句
    【解决方案3】:

    这就是它在 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

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多