用于显示项目详细信息的Oracle过程

时间:2014-12-08 21:05:50

标签: oracle stored-procedures plsql

我正在尝试创建一个带有参数(ID号)的过程,并输出有关该特定项的一些信息。假设我有两个表: 产品(id,name,desc,price) 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更好的方法? 谢谢,

1 个答案:

答案 0 :(得分:1)

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

一旦程序编译完毕,我预计你在调用程序时会得到一个运行时错误(表明你的查询返回了太多行),因为连接错误了 - 你加入了{{1}表到自己而不是line_item表。

product

应该是

AND l.product_id = l.product_id

这是我更喜欢SQL 99连接语法的原因之一,而不是你在这里使用的旧语法 - 这使得更容易区分连接条件和过滤谓词,这使得更容易注意到这种错误

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

当然,在实际代码中,您几乎肯定不会定义一个程序,其唯一目的是写入AND l.product_id = p.product_id ,因为您通常不会认为任何人都会看到该数据。 dbms_output实际上只用于快速和脏调试。不过,我认为你是一名学生,这是家庭作业的一部分。