PL / SQL游标 - 从多个表中检索数据

时间:2018-04-20 12:48:31

标签: sql plsql oracle11g sqlplus database-cursor

我需要输入产品代码作为参数,以检索所述产品和其他信息。我需要比我提供的更多信息,我已经开始小规模尝试尽早调试任何错误,但我不明白为什么下面的代码不起作用。我正在使用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);

1 个答案:

答案 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之间没有连接,因此您的结果集将是产品(交叉连接)或两个表中的所有记录。几乎可以肯定你不希望这样。

此外,不应在异常处理程序中重新引发异常(除了某些边缘情况)是不好的做法。在这样的玩具代码中没关系,但不要陷入坏习惯。