编写一个 PL/SQL Proc 并在 proc 中调用一个函数。输入是productid。打印出订购产品 ID 的客户姓名

Posted

技术标签:

【中文标题】编写一个 PL/SQL Proc 并在 proc 中调用一个函数。输入是productid。打印出订购产品 ID 的客户姓名【英文标题】:Write a PL/SQL Proc and calling a function within the proc. The input is productid. prints out the customer names who have ordered Product ID 【发布时间】:2021-11-29 06:25:52 【问题描述】:

4张桌子

customer - custid (PK), customer_name
order- orderid(pk), custid(fk)
orderline-orderid(pk,fk), productid(pk,fk)
product-productid(pK)

这是函数

    CREATE OR REPLACE FUNCTION get_customer_name(cust_id IN S_ORDER_T.ORDER_ID%TYPE) 
    RETURN VARCHAR
    IS 
    cname VARCHAR (50);
    BEGIN
      SELECT customer_name
      INTO   cname
      FROM   s_order_t o
         INNER JOIN s_customer_t c
         ON (o.customer_id = c.customer_id)
      WHERE o.order_id = cust_id;

      RETURN cname;
    EXCEPTION
       WHEN no_data_found THEN
       RETURN NULL;
    END;

调用函数的过程*

CREATE OR REPLACE PROCEDURE print_all_customers(cust_id IN s_order_t.order_id%TYPE)
IS
cnames VARCHAR (50);
BEGIN
   cnames := get_customer_name(cust_id);
   IF cnames > 0 THEN
   DBMS_OUTPUT.PUT_LINE (cnames);
   ELSE
   DBMS_OUTPUT.PUT_LINE ('NO Customer FOUND');
   END IF;
END;

BEGIN
   print_all_customers (1);
END;

/加入其他表需要改函数吗?/

【问题讨论】:

请为表格提供完整的 ddl(实际的“创建表格”语句和足够的样本数据)——这样任何试图帮助您的人都可以在他的环境中复制和运行脚本。没有开发者喜欢打字……你有什么错误吗?你被困在哪里了? 也看看meta.***.com/questions/334822/… 看看是否适用。 我一直在调用该函数。当我执行匿名程序时,我的输出未找到客户 【参考方案1】:

您混淆了 ORDER_ID 和 CUST_ID;在正常系统中,这些值没有任何关系。由于您已经拥有 CUST_ID,因此无需将其加入订单表:

CREATE OR REPLACE FUNCTION get_customer_name(p_cust_id IN NUMBER)
    RETURN VARCHAR2
    IS 
    cname VARCHAR (50);
    BEGIN
      SELECT customer_name
      INTO   cname
      FROM   s_customer_t c
      WHERE  c.cust_id = p_cust_id;

      RETURN cname;
    EXCEPTION
       WHEN no_data_found THEN
       RETURN NULL;
    END;

您很可能正在寻找是否有返回值的事实。我建议这样做:

CREATE OR REPLACE PROCEDURE print_all_customers(cust_id IN s_order_t.cust_id%TYPE)
IS
cnames VARCHAR (50);
BEGIN
   cnames := nvl(get_customer_name(cust_id), 'NO Customer FOUND');
   DBMS_OUTPUT.PUT_LINE (cnames);
END;

但这只会为您提供 1 个客户,而不是第二个程序名称中所示的多个客户。

【讨论】:

以上是关于编写一个 PL/SQL Proc 并在 proc 中调用一个函数。输入是productid。打印出订购产品 ID 的客户姓名的主要内容,如果未能解决你的问题,请参考以下文章

如何通过休眠访问 pl/sql proc 中的 out 参数

在 PL/SQL 中并行化调用

参数 <Proc_Name> 的编号或类型错误,最后一条记录显示两次 - PL SQL

MYSQL PL/SQL

包括编写在不同文件中的过程以打包在 PL/SQL 中

proc中的Oracle查询不返回结果