Sql 创建遍历视图的游标?

Sql 创建遍历视图的游标?,sql,mariadb,Sql,Mariadb,这些是桌子。Product.model是主键。PC.model、Laptop.model和Printer.model是引用Product.model的外键 对于每个视图(下面的代码),我想创建一个游标,在模型列表中迭代并连接条目,这样它看起来就像->“maker”-“type model”代表“price” 我知道有更简单的方法,但我尝试过使用存储过程 create view PCView as select Product.maker, Product.type, PC.model, PC.s

这些是桌子。Product.model是主键。PC.model、Laptop.model和Printer.model是引用Product.model的外键

对于每个视图(下面的代码),我想创建一个游标,在模型列表中迭代并连接条目,这样它看起来就像->
“maker”-“type model”代表“price”

我知道有更简单的方法,但我尝试过使用存储过程

create view PCView
as select Product.maker, Product.type, PC.model, PC.speed, PC.ram, PC.hd, PC.price
from PC, Product
where PC.model = Product.model;

create view LaptopView
as select Product.maker, Product.type, Laptop.model, Laptop.speed, Laptop.ram, Laptop.hd, Laptop.screen, Laptop.price
from Laptop, Product
where Laptop.model = Product.model;

create view PrinterView
as select Product.maker, Product.type, Printer.model, Printer.color, Printer.type as printerType, Printer.price
from Printer, Product
where Printer.model = Product.model;
在创建了存储过程之后

DELIMITER $$
CREATE PROCEDURE createProductList ( INOUT productList varchar(4000) )
BEGIN
     DECLARE finished INTEGER DEFAULT 0;
     DECLARE PCViewList varchar(100) DEFAULT "";
     -- declare cursor for PCView
     DEClARE cursorViewPC CURSOR FOR SELECT model FROM PCView;
     -- declare NOT FOUND handler
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
     OPEN cursorViewPC;
    getProduct: LOOP
          FETCH cursorViewPC INTO PCViewList;
         IF finished = 1 THEN
              LEAVE getProduct;
         END IF;
        -- build email list
     SET productList =CONCAT(PCViewList,";",productList);   
     END LOOP getProduct;
   CLOSE cursorViewPC;
END$$
DELIMITER ;
我的输出是


1013;1012;1011;1010;1009;1008;1007;1006;1005;1004;1003;1002;1001;这些只是并排的型号。我试图让它看起来像这样->
“maker”-“type model”代表“price”
,并让每个列表都有自己的行。非常感谢您的帮助。

为什么不在每个视图中使用类似的内容:

SET @productList = "";

CALL createProductList(@productList);

SELECT @productList;
也可以在每个视图中添加该列

另外,如果您想使用cursor,您做了正确的事情,每次只会丢失要获取的其他列,如下所示:(它可能有一些语法错误,但您知道了)


事实上,我只是想办法

如果我想在这里插入换行符

SET productList=CONCAT(makerCol,“-”,typeCol,“”,modelCol,“for”,priceCol,“,productList)


对于每个获取,而不是中间的空格,我如何才能这样做?

因为我想知道如何使用光标在视图中进行迭代。存储过程不是必需的,但我想知道如何在存储过程中完成这一切。不过,只用一个光标就足够了。您的推荐无论如何都是有帮助的。@davenport cursor无法有效地解决此问题,但如果您只是为了使用cursor,请务必使用它。我想学习如何使用cursor,如果可能的话,我想知道如何在存储过程中使用cursor。效率现在不是一个考虑因素。@davenport那么到目前为止,您走的是正确的道路,请参阅更新的replyDoesn。我感觉我走的不是正确的道路,除非您重新定义了“right”一词。在“\n”末尾添加新行字符:SET productList=CONCAT(makerCol,“-”,typeCol,“,modelCol,“for”,priceCol,“\n”,productList);
SET @productList = "";

CALL createProductList(@productList);

SELECT @productList;
select CONCAT(maker,'-',type,' ',model,' for', price) from PCView
union
select CONCAT(maker,'-',type,' ',model,' for', price) from LaptopView
union
select CONCAT(maker,'-',type,' ',model,' for', price) from PrinterView
DELIMITER $$
CREATE PROCEDURE createProductList ( INOUT productList varchar(4000) )
BEGIN
     DECLARE finished INTEGER DEFAULT 0;
     DECLARE PCViewList varchar(100) DEFAULT "";
     declare maker integer 
            , model integer 
            , type INTEGER
            , model integer 
            , price integer 

     -- declare cursor for PCView
     DEClARE cursorViewPC CURSOR FOR SELECT maker,type,model, price FROM PCView;
     -- declare NOT FOUND handler
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
     OPEN cursorViewPC;
    getProduct: LOOP
          FETCH cursorViewPC INTO maker,type,model, price;
         IF finished = 1 THEN
              LEAVE getProduct;
         END IF;
        -- build email list
     SET productList =CONCAT(productList,';',maker,'-',type,' ',model,' for', price));   
     END LOOP getProduct;
   CLOSE cursorViewPC;
END$$
DELIMITER ;