【问题标题】:Oracle procedure to display detail about an item用于显示项目详细信息的 Oracle 过程
【发布时间】:2015-02-06 15:13:08
【问题描述】:

我正在尝试创建一个过程,该过程接受一个参数(ID 号)并输出有关该特定项目的一些信息。假设我有两个表: 产品(id、名称、描述、价格) line_item (prod_id, total, quantity, cust_id)

这是我目前所拥有的:

CREATE OR REPLACE PROCEDURE product_query (p_id IN Number)
RETURN NUMBER
  IS
       v_product_id     NUMBER;
       v_description    NUMBER;
       v_sub    NUMBER; 
       v_total_quantity    NUMBER;
       v_order_count NUMBER;
BEGIN

SELECT p.product_id, sum(l.subtotal), sum(l.quantity), count(*)
INTO v_product_id, v_sub, v_total_quantity, v_order_count
FROM line_item l, product p
       WHERE p.product_id = p_id
       AND
       l.product_id = l.product_id
       group by p.product_id;
       DBMS_OUTPUT.PUT_LINE('ID: ' || p_product_id);
       DBMS_OUTPUT.PUT_LINE('Subtotal: ' || v_sub);
       DBMS_OUTPUT.PUT_LINE('Total Qt: ' || v_total_quantity);
       DBMS_OUTPUT.PUT_LINE('Total Order: ' || v_order_count);
END product_query;

但它不显示任何输出。我没有看到代码有任何问题。我应该改变输出信息的方式吗?有比 DBMS_OUTPUT.PUT_LINE 更好的方法吗? 谢谢,

【问题讨论】:

  • 您的代码中有一些拼写错误。如果您的程序有效,我想您的编辑器不会显示输出。你可以试试 SET SERVEROUTPUT ON
  • 谢谢,但这不是 SQL*Plus 命令吗?我正在使用 SQL Developer UI。另外,我认为问题是由于顶部的 RETURN NUMBER,但它需要在 IS 之后返回。
  • 正如 Justin Cave 在他的回复中指出的那样:您声明的是 PROCEDURE 而不是 FUNCTION。只有后者,它执行RETURN 一个值。如果你想从一个过程中取回一些东西,你需要在它的参数列表中使用OUTIN OUT 参数。喜欢CREATE [OR REPLACE] PROCEDURE procName (paramName OUT DataType) CREATE [OR REPLACE] PROCEDURE procName (paramName IN OUT DataType)

标签: oracle stored-procedures plsql


【解决方案1】:

我假设您在尝试创建过程时遇到编译错误——过程不返回任何内容,因此RETURN NUMBER 无效,仅在函数中有效。但是,如果您遇到编译错误,发布错误会有所帮助。

一旦过程编译,我希望您在调用过程时会收到运行时错误(表明您的查询返回了太多行),因为连接错误 - 您正在加入 line_item 表到它自己而不是到product 表。

AND l.product_id = l.product_id

应该,大概是

AND l.product_id = p.product_id

这是我更喜欢 SQL 99 连接语法而不是您在此处使用的旧语法的原因之一——它使区分连接条件和过滤谓词变得更加容易,从而更容易注意到这种错误.

一旦您的过程编译并可以成功调用,您需要启用输出。这将在不同的客户端工具中以不同的方式完成,但这里是a question that walks through enabling dbms_output in SQL*Plus and SQL Developer

当然,在实际代码中,您几乎肯定不会定义一个唯一目的是写入dbms_output 的过程,因为您通常不会假设任何人都会看到该数据。 dbms_output 实际上只用于快速调试。不过,我假设您是一名学生,并且这是家庭作业的一部分。

【讨论】:

  • 这是正确的先生,感谢您的解释。
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2016-07-05
相关资源
最近更新 更多