SQL 过程 - 啥都没有打印出来
Posted
技术标签:
【中文标题】SQL 过程 - 啥都没有打印出来【英文标题】:SQL Procedure - Nothing is printed outSQL 过程 - 什么都没有打印出来 【发布时间】:2017-05-31 11:11:31 【问题描述】:当我尝试运行此代码时,它没有显示任何输出,我不知道为什么。
此过程接受客户 ID 并显示所有订单 由指定客户制作。它使用游标来存储详细信息 订单,然后打印详细信息。
SET SERVEROUTPUT ON;
create or replace PROCEDURE procedure_CustOrderHistory (cust_id IN number) AS
CURSOR c_CustOrderHistory IS
Select o.order_id, o.order_totalCost, o.order_date, cu.customer_firstName,
cu.customer_lastName, s.staff_firstName, s.staff_lastName, os.order_status
FROM orders o, customer cu, staff s, order_status os
where o.customer_id=cu.customer_id AND s.staff_id = o.staff_id AND
os.order_statusID = o.order_statusID and cu.customer_id = cust_id ;
BEGIN
FOR r_order IN c_CustOrderHistory
LOOP
dbms_output.put_line('Order ID: '||r_order.order_id || ', Order Total Cost: ' || r_order.order_totalCost || 'BHD, Order Date: ' || r_order.order_date || ', Customer Name: ' || r_order.customer_firstName || ' ' || r_order.customer_lastName|| ', Customer Name: ' || r_order.customer_firstName || ' ' || r_order.customer_lastName || ', Order Status: '|| r_order.order_status);
END LOOP;
END;
这个匿名块测试前面的过程。它询问用户 获取一个 ID,然后通过传入客户 ID 调用该过程。
SET SERVEROUTPUT ON;
DECLARE
v_custid number := &customerid;
BEGIN
procedure_CustOrderHistory(v_custid);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Customer ID not found.');
WHEN OTHERS THEN
dbms_output.put_line('Error! ' || SQLERRM);
END;
【问题讨论】:
欢迎来到 Stack Overflow。请阅读How to Ask 并创建一个minimal reproducible example。我们只能说:如果您没有与 WHERE 子句对应的数据并且没有发生错误,则此查询将不打印任何内容。 你在哪里运行这个?例如。在 SQL*Plus 中,您需要在两组代码后使用正斜杠 正如 Tom Kyte 所说,这就像去找你的机械师说“我的车无法启动,我不知道为什么”...... 我不是 Oracle 专家。但是在 SQL Server 中,如果我们连接 NULL 值,我们将不会得到结果。在这里,您连接了这么多列。检查它们中的任何一个是否返回 NULL ,因此您没有得到。 这只是我的猜测,不是分析结果 【参考方案1】:游标循环不会抛出 NO_DATA_FOUND。因此,如果您的查询没有返回任何行,则游标将循环零次并优雅地退出。
所以很可能发生的情况是没有customer
记录与您在提示时传递的 ID 对应,或者游标查询中存在其他一些逻辑问题(例如,客户没有订单)。
您可以通过添加这样的计数器来测试我的理论:
create or replace PROCEDURE procedure_CustOrderHistory (cust_id IN number) AS
CURSOR c_CustOrderHistory IS
Select o.order_id, o.order_totalCost, o.order_date, cu.customer_firstName,
cu.customer_lastName, s.staff_firstName, s.staff_lastName, os.order_status
FROM orders o, customer cu, staff s, order_status os
where o.customer_id=cu.customer_id AND s.staff_id = o.staff_id AND
os.order_statusID = o.order_statusID and cu.customer_id = cust_id ;
rec_ctr pls_integer := 0;
BEGIN
FOR r_order IN c_CustOrderHistory
LOOP
rec_ctr := rec_ctr +1;
dbms_output.put_line('#'|| rec_ctr ||' '||
'Order ID: '||r_order.order_id || ', Order Total Cost: ' || r_order.order_totalCost || 'BHD, Order Date: ' || r_order.order_date || ', Customer Name: ' || r_order.customer_firstName || ' ' || r_order.customer_lastName|| ', Customer Name: ' || r_order.customer_firstName || ' ' || r_order.customer_lastName || ', Order Status: '|| r_order.order_status);
END LOOP;
if rec_ctr = 0 then
raise no_data_found;
end if;
END;
如果循环没有处理任何行,这会显式引发异常。
"。但是,即使我输入了有效的 CustomerID,它也不会显示它。你知道吗?"
您的查询连接了四个表。所以你需要通过查询的逻辑来确保:
-
连接条件指定正确
表中有匹配的数据
例如,您输入的客户有订单吗?如果是,他们的订单是否具有有效的订单状态。订单员工身份证是否有效?
【讨论】:
谢谢!它工作并显示错误作为输出。但是,即使我输入了有效的 CustomerID,它也不会显示它。你有什么想法吗? 如果这个答案对你有帮助,你应该投票和/或接受它。接受的答案改进了 *** 作为未来寻求者的资源。以上是关于SQL 过程 - 啥都没有打印出来的主要内容,如果未能解决你的问题,请参考以下文章
如何将ORACLE存储过程中SQL的结果集打印出来,并且按照一定的格式封装到一个字符串中呢
关于linux系统下TCP通信 服务器read函数一直读取数据却啥都读不到的问题
有关Matlab中从三级小波域内提取水印遇到的问题,提取出的水印啥都没有,嵌入过程则没有问题。