MYSQL

2011-11-23 19 views
5

में कर्सर का उपयोग किए बिना इटरेटिंग मैं संग्रहीत प्रक्रियाओं में नया हूं। मेरा कार्य एक संग्रहित प्रक्रिया लिखना है जो पहले अस्थायी तालिका से डेटा को मान्य करेगा और फिर डेटा को मुख्य तालिका में डालें। इसके लिए मैं अस्थायी तालिका की प्रत्येक पंक्ति पर पुनरावृत्ति करने की योजना बना रहा हूं, इसे किसी अन्य संग्रहीत प्रक्रिया या उपयोगकर्ता परिभाषित फ़ंक्शन का उपयोग करके सत्यापित करें और फिर डेटा को मुख्य तालिका में डालें।MYSQL

मेरी समस्या यह है कि CURSORS का उपयोग किए बिना अस्थायी तालिका की पंक्तियों पर पुनरावृत्ति कैसे करें क्योंकि वे बहुत धीमी और स्मृति उपभोग कर रहे हैं। मैं CURSOR के बजाय कुछ लूपिंग संरचना का उपयोग करना चाहता हूं।

बेशक अगर उपरोक्त समस्या के लिए किसी के पास कोई अन्य एल्गोरिदम है तो सुझावों का स्वागत है।

पुनश्च: मैं MYSQL डीबी

+2

सम्मिलित करें पर एक नजर डालें ... चयन कथन - http://dev.mysql.com/doc/refman/5.1/en/insert-select.html – Devart

+0

प्रमाणीकरण नियम/सी क्या है स्तोत्र? यह जानना आवश्यक होगा कि सत्यापन कर्सर है या यदि आपका सत्यापन पंक्ति-स्वतंत्र है। – Nonym

उत्तर

5

उपयोग कर रहा हूँ कर्सर के उपयोग के बिना, आप एक अस्थायी मेज और एक While..Do कथन का उपयोग पुनरावृति सकता है।

मान लीजिए कि आप दो तालिकाओं

CREATE TABLE `user` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

और

CREATE TABLE `tmp_user` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

है दिनचर्या निम्नलिखित बनाएं, और सत्यापन प्रक्रिया को समायोजित:

DELIMITER $$ 
USE `routines_sample`$$ 
CREATE PROCEDURE `nocursor`() 
BEGIN 
    Declare validId int; 
    Declare validName varchar(45); 

    -- drop the temporary table if exists 
    Drop table if exists `routines_sample`.tmp_validation; 
    -- create the temporary table, here you could use Engine=Memory 
    Create table `routines_sample`.tmp_validation (`id` int not null, `name` varchar(45) not null, `valid` bit(1) not null) Engine=MyISAM; 

    -- insert into the temporary table with a valid flag = 0 (false)  
    Insert into `routines_sample`.tmp_validation (`id`, `name`, `valid`) 
    Select tu.id, tu.name, 0 
    From `routines_sample`.tmp_user tu; 

    -- while exists data to validate on temporary table do something  
    While exists(Select `id` From `tmp_validation` Where `valid` = 0) Do 

    Select `id`, `name` Into @validId, @validName From tmp_validation Where `valid` = 0 Limit 1; 

    -- do your validation 
    Select @validId, @validName; 

    -- don't forget to update your validation table, otherwise you get an endless loop  
    Update `tmp_validation` 
    Set `valid` = 1 
    Where `id` = @validId; 

    END WHILE; 

    -- insert only valid rows to your destination table  
    Insert into `routines_sample`.`user` (`name`) 
    Select `name` From `tmp_validation` 
    Where `valid` = 1; 

    -- drop the temporary table  
    DROP TABLE tmp_validation; 

END$$ 

DELIMITER ; 
+0

धन्यवाद ... मैं इस तरह कुछ ढूंढ रहा था :) –

+0

यह सुनकर अच्छा लगा! @RachitAgrawal आप जवाब स्वीकार कर सकते हैं :) – mbenegas

 संबंधित मुद्दे