编写一个 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 参数