2010-06-15 17 views
10

एसक्यूएल प्रश्नों में 'गोटो' कथन का उपयोग करना अच्छा अभ्यास है?एसक्यूएल - गोटो स्टेटमेंट

+9

http://xkcd.com/292/ – ircmaxell

+1

@ircmaxell मेरी भावनाओं को वास्तव में: लेबल बिंदु है जहां हम कूद चाहिए। – Meiscooldude

+0

एसक्यूएल में कोई 'गोटो' नहीं है - केवल टी-एसक्यूएल –

उत्तर

8

एसक्यूएल पर निर्भर करता है - कुछ बोलीभाषाएं गोटो के अलावा प्रवाह नियंत्रण के लिए उपयोगी तंत्र प्रदान नहीं करती हैं।

गोटो आम तौर पर खराब रूप है।

0

मेरा अनुमान नहीं होगा। किसी भी आधुनिक भाषा में गेटो स्टेटमेंट के साथ मेरा सामान्य नियम है, यदि आप उनका उपयोग करते हैं, तो आपके डिजाइन में कुछ गड़बड़ है।

3

सं

अन्य भाषाओं की तरह ही, लगभग हमेशा एक गोटो से उपयोग करने के लिए एक बेहतर विकल्प है।

यदि आप हमें बताते हैं कि आप कौन सी एसक्यूएल पैकेज का उपयोग कर रहे हैं और आप क्या हासिल करने की कोशिश कर रहे हैं, तो हम आपको यह बता सकते हैं कि वास्तव में कौन सा फिट हो सकता है।

+0

यह किसी द्वारा लिखित एक संग्रहीत प्रक्रिया है। – SoftwareGeek

+0

@hejaFry - लेकिन क्या यह टी-एसक्यूएल, पीएल-एसक्यूएल, माईएसक्यूएल, आदि है? –

+0

यह टी-एसक्यूएल है, pl-sql समर्थन goto नहीं होगा? – SoftwareGeek

5

उत्पादन कोड में नहीं, लेकिन परीक्षण के लिए ठीक हो सकता है।

उदाहरण के लिए, एक संग्रहीत प्रक्रिया के लिए रिग्रेशन परीक्षण प्रदान करना चाहते हैं जहां "सामान्य बिट" परीक्षण की प्रक्रिया और डीबग कथन की कॉल है।

declare @test int; 
set @test = 1; 
goto tests 

common: 
print "common bit" 

tests: 
if @test = 1 print "1"; 
if @test = 2 print "2"; 
if @test = 3 print "3"; 

set @test = @test + 1; 
if @test <= 3 goto common 
print "finished " + cast(@test as varchar(5)) 
go -- goto can not be used past go! 

एक टी एसक्यूएल noob मैं प्रक्रिया या समारोह के लिए उम्मीद कर रही थी दायरे के भीतर घोषित करने के लिए "आम बिट" ऐसा करने के लिए होने के नाते, लेकिन यह सबसे अच्छा मैं बहुत बाद googling के साथ आ सकता था। आपको प्रत्येक कोड के लिए एक संग्रहीत प्रक्रिया क्यों सेट अप करनी होगी जिसे आप दोबारा उपयोग करना चाहते हैं। विशेष रूप से गैर उत्पादन के काम के लिए।

+0

आप GOTO का उपयोग कर कार्यक्षमता के छोटे बिट्स का उपयोग करने के बारे में एक महान बिंदु बनाते हैं। :-) हमें टी-एसक्यूएल में लैम्ब्डा एक्सप्रेशन की ज़रूरत है! ;-) –

0

goto अपनी विशेषता के साथ कीवर्ड है। जब भी इसे सीधे कुछ स्तर तक कूदने की आवश्यकता होती है तो हम गोटो का उपयोग कर सकते हैं।

उदाहरण लेते हैं ... मेरी संग्रहीत प्रक्रिया में मुझे 4 temp तालिकाओं में डेटा लेने के साथ काम करने की आवश्यकता है। temp तालिका में रिकॉर्ड डालने के बाद प्रत्येक स्तर पर मुझे यह जांचना होगा कि इस अस्थायी अस्थायी में रिकॉर्ड मौजूद हैं या नहीं, अगर कोई रिकॉर्ड नहीं डाला गया है तो आगे प्रसंस्करण के बजाय मैं सीधे गेटो का उपयोग करके नीचे कूद सकता हूं।

CREATE TABLE #tmpMsNos (custPo CHAR(24)) 

    CREATE TABLE #tmpValidBilltos (billto CHAR(12)) 

    CREATE TABLE #tmpOrders (
     fh_pkey INT 
     ,fh_id CHAR(8) 
     ,custPo CHAR(24) 
     ,lastchOfCustInsert DATETIME 
     ) 

    CREATE TABLE #tmpOrdersFiltered (
     fh_pkey INT 
     ,fh_id CHAR(8) 
     ,custPo CHAR(24) 
     ,lastchOfCustInsert DATETIME 
     ,onbDate DATETIME 
     ,rapDate DATETIME 
     ) 

    CREATE TABLE #tmpLoad (
     custPo CHAR(24) 
     ,ld_pkey INT 
     ,ld_wkpmpn CHAR(25) 
     ,lda_barcode VARCHAR(30) 
     ,ld_createdOn DATETIME 
     ,ReceivedDate DATETIME 
     ,DispatchedDate DATETIME 
     ) 

INSERT INTO #tmpMsNos 
    SELECT cast(itemValue AS CHAR(24)) 
    FROM dbo.fn_array_to_table(@pMsNos, ',') 

IF (
      NOT EXISTS (
       SELECT 1 
       FROM #tmpMsNos 
       ) 
      ) 
    BEGIN 
     GOTO label 
    END 
INSERT INTO #tmpValidBilltos 
    SELECT CONVERT(CHAR(12), xm_doref) 
    FROM xmlref x 
    WHERE xm_element = 'THD-BoxtruckRequest' 
     AND xm_attribute = 'THD-BoxtruckBillto' 

IF (
      NOT EXISTS (
       SELECT 1 
       FROM #tmpValidBilltos 
       ) 
      ) 
    BEGIN 
     GOTO label 
    END 

INSERT INTO #tmpOrders 
    SELECT fh.fh_pkey 
     ,fh.fh_id 
     ,fh.fh_custPo 
     ,max(coc.ch_dt) 
    FROM #tmpMsNos msNos 
    INNER JOIN fcfgthd fh ON msNos.custPo = fh.fh_custPo 
    INNER JOIN #tmpValidBilltos bt ON bt.billto = fh.fh_bt_id 
    LEFT JOIN chofcust coc ON coc.ch_fhpkey = fh.fh_pkey 
    WHERE fh.fh_statcode NOT IN (
      98 --CAN 
      ,99 --DEL 
      ) 
     AND fh.fh_ship_dt > @startDate 
    GROUP BY fh.fh_pkey 
     ,fh.fh_id 
     ,fh.fh_custPo 

    IF (
      NOT EXISTS (
       SELECT 1 
       FROM #tmpOrders 
       ) 
      ) 
    BEGIN 
     GOTO label 
    END 

INSERT INTO #tmpOrdersFiltered 
    SELECT t.fh_pkey 
     ,t.fh_id 
     ,t.custPo 
     ,t.lastchOfCustInsert 
     ,MAX(cocONB.ch_dt) 
     ,MAX(cocRAP.ch_dt) 
    FROM (
     SELECT tmpO.fh_pkey 
      ,tmpo.fh_id 
      ,tmpO.custPo 
      ,tmpO.lastchOfCustInsert 
     FROM #tmpOrders tmpO 
     INNER JOIN (
      SELECT custpo 
       ,max(lastchOfCustInsert) AS MaxInserteddate 
      FROM #tmpOrders 
      GROUP BY custpo 
      ) tmpOgrouped ON tmpO.custpo = tmpOgrouped.custpo 
      AND tmpO.lastchOfCustInsert = tmpOgrouped.MaxInserteddate 
     ) AS t 
    LEFT JOIN chofcust cocRAP ON cocRAP.ch_fhpkey = t.fh_pkey 
     AND cocRAP.ch_stat = 2 -- RAP --TODO: Add comment with status code like 98, 99 -- CAN, DEL for readability - Paresh 
    LEFT JOIN chofcust cocONB ON cocONB.ch_fhpkey = t.fh_pkey 
     AND cocONB.ch_stat = 5 -- ONB --TODO: Add comment with status code like 98, 99 -- CAN, DEL for readability - Paresh 
    GROUP BY t.fh_pkey 
     ,t.fh_id 
     ,t.custPo 
     ,t.lastchOfCustInsert 

    --TODO: Take an exit if no order found into #tmpOrdersFiltered table, while taking a early exit make sure it doesn't break the calling code (C#) - Paresh 
    IF (
      NOT EXISTS (
       SELECT 1 
       FROM #tmpOrdersFiltered 
       ) 
      ) 
    BEGIN 
     GOTO label 
    END 
INSERT INTO #tmpLoad 
    SELECT o.custPo 
     ,l.ld_pkey 
     ,l.ld_wkpmpn 
     ,la.lda_barcode 
     ,max(coc.ch_dt) 
     ,CASE ISNULL(w.xl_date, '') 
      WHEN '' 
       THEN o.rapDate 
      ELSE w.xl_date 
      END AS ReceivedDate 
     ,CASE ISNULL(mm.me_ecpkey, '') 
      WHEN '' 
       THEN o.ONBDate 
      ELSE NULL 
      END AS DispatchedDate 
    FROM #tmpOrdersFiltered o 
    INNER JOIN fcload l ON l.ld_fhpkey = o.fh_pkey 
    LEFT JOIN loadanc la ON la.lda_ldpkey = l.ld_pkey 
    LEFT JOIN wkxaclog w ON w.xl_ldpkey = l.ld_pkey 
    LEFT JOIN multiexceps mm ON mm.me_ldpkey = l.ld_pkey 
     AND mm.me_ecpkey = @missingitemexcep 
    LEFT JOIN chofcust COC ON coc.ch_ldpkey = l.ld_pkey 
     AND coc.ch_stat = 64 -- 64= ILH 
    GROUP BY o.custPo 
     ,l.ld_pkey 
     ,l.ld_wkpmpn 
     ,la.lda_barcode 
     ,w.xl_date 
     ,o.rapDate 
     ,mm.me_ecpkey 
     ,o.ONBDate 
संबंधित मुद्दे