我需要输入产品代码作为参数,以检索所述产品和其他信息。我需要比我提供的更多信息,我已经开始小规模尝试尽早调试任何错误,但我不明白为什么下面的代码不起作用。我正在使用SQLPlus,非常感谢任何帮助。
INSERT INTO `account_types`(`type`, `group`)
SELECT * FROM
(SELECT '400' `type`, 'test' `group` UNION ALL
SELECT '401' `type`, 'test2' `group` UNION ALL
SELECT '402' `type`, 'test3' `group`) A
WHERE NOT EXISTS (SELECT NULL FROM account_types B WHERE A.type=B.type);
答案 0 :(得分:0)
当我们获取变量时,它的结构必须与我们提取的查询的投影相匹配。或者,如果我们要获取多个变量,我们在投影中每列需要一个变量。您的代码也没有。
最简单的解决方案是使用光标定义变量,如下所示:
CURSOR cur_products IS
SELECT p.name, p.prod_id, p.description, p.unit_price, s.order_no
FROM PRODUCTS P, SUBORDERS S
WHERE p.prod_id = product_no;
v_rec cur_products%TYPE;
BEGIN
OPEN cur_products;
LOOP
FETCH cur_products INTO v_rec;
...
另一种解决方案是使用隐式游标。您可以像这样重写代码:
CREATE OR REPLACE PROCEDURE product_info(PRODUCT_NO IN CHAR)
AS
BEGIN
for v_rec in (SELECT p.name, p.prod_id, p.description, p.unit_price, s.order_no
FROM PRODUCTS P, SUBORDERS S
WHERE p.prod_id = product_no )
LOOP
DBMS_OUTPUT.PUT_LINE('Product Code: ' || v_rec.prod_id
|| ' Name: ' || v_rec.name
|| ' Description: ' || v_rec.description
|| ' Price: ' || v_rec.unit_price
|| ' Order: ' || v_rec.odrer_no);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.PUT_LINE ('Product number does not exist');
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('Operation failed ' || 'SQLCODE: ' || SQLCODE);
ROLLBACK;
END;
/
顺便提一下,您查询产品和SUBORDERS之间没有连接,因此您的结果集将是产品(交叉连接)或两个表中的所有记录。几乎可以肯定你不希望这样。
此外,不应在异常处理程序中重新引发异常(除了某些边缘情况)是不好的做法。在这样的玩具代码中没关系,但不要陷入坏习惯。