我正在尝试创建一个带有参数(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更好的方法? 谢谢,
答案 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
实际上只用于快速和脏调试。不过,我认为你是一名学生,这是家庭作业的一部分。