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的结果集打印出来,并且按照一定的格式封装到一个字符串中呢

oracle存储过程中循环调用存储过程

关于linux系统下TCP通信 服务器read函数一直读取数据却啥都读不到的问题

有关Matlab中从三级小波域内提取水印遇到的问题,提取出的水印啥都没有,嵌入过程则没有问题。

java调用oracle存储过程 关于sql里面in函数参数的问题

我想写两个plsql程序。在一个过程中获取数据并从第二个过程中打印出来