2011-12-13 10 views
5

अद्यतन करना मैं वर्तमान में फ़ायरबर्ड बनाम 1.5 डेटाबेस को संशोधित करने पर काम कर रहा हूं।जनरेटर मूल्य समस्या

डेटाबेस संरचना इंटरबेज घटकों का उपयोग करके डेल्फी एप्लिकेशन से चल रहे प्रश्नों को संशोधित किया जाएगा, मुझे जिस समस्या का सामना करना पड़ रहा है वह है कि मुझे बहुत से प्रश्नों को चलाने की आवश्यकता है, जिनमें से कुछ जेनरेटर बनाने और जनरेटर मूल्य को अपडेट करने में शामिल हैं,

/* this command creates a generator to be used for table TABLENAME */ 
CREATE GENERATOR GEN_TABLENAME; 

तो: समस्या यह है कि मैं संभव के रूप में कुछ प्रश्नों में इस लक्ष्य को हासिल करने की जरूरत है, लेकिन यह (कम से कम मेरे लिए) लगता है कि यह वास्तव में संभव नहीं है, मैं क्या करने की कोशिश कर रहा हूँ पीछा कर रहा है मैंने जनरेटर बनाया है, अब मुझे टेबल TABLENAME से वर्तमान अधिकतम आईडी पर इसका मान सेट करने की आवश्यकता है, जैसे:

/* one would expect that the following command would work, well it doesn't */ 
SET GENERATOR GEN_TABLENAME TO (SELECT MAX(ID) FROM TABLENAME); 

अब, वहाँ इस के लिए किसी भी समाधान नहीं है, या मैं करने के लिए मजबूर कर रहा हूँ:

  • जनरेटर
  • अधिकतम आईडी
  • अद्यतन जनरेटर मूल्य प्राप्त बनाने

और दोहराने हर टेबल के लिए प्रक्रिया?

मैं भी उम्मीद है कि

SELECT 
    SELECT MAX(ID) AS ID_TABLENAME_1 FROM TABLENAME_1, 
    ... 
    SELECT MAX(ID) AS ID_TABLENAME_N FROM TABLENAME_N 

एक समाधान के एक आदेश में अधिकतम हर मेज से पहचान-पत्र प्राप्त करने के लिए होगा, लेकिन ऐसा नहीं है।

+0

आप किस घटक का उपयोग कर रहे हैं? – rstrelba

+0

@rstrelba इंटरबेस – ComputerSaysNo

+0

मुझे डेल्फी घटकों के नाम रुचि है। TIBDatabase? TIBQuery? TIBDataSet? – rstrelba

उत्तर

6

वक्तव्य

SET GENERATOR GEN_TABLENAME TO (SELECT MAX(ID) FROM TABLENAME); 

घुलमिल DDL (SET GENERATOR) और DML (SELECT), AFAIK यह आम तौर पर समर्थित नहीं है और Firebird पक्का इसका समर्थन नहीं करता।

आप Firebird के नवीनतम संस्करण में नवीनीकृत कर सकते हैं तो आप EXECUTE BLOCK और/या EXECUTE STATEMENT इस्तेमाल कर सकते हैं यह सब करने के लिए और सर्वर साइड "एक बयान में", लेकिन Firebird 1.5 के साथ आप काफी मदद के लिए समझौता किया है (एक वर्तमान अधिकतम प्राप्त करने के लिए कथन, फिर एक और जनरेटर अद्यतन)।

+0

+1 आपको धन्यवाद, मैं अपग्रेड नहीं कर सकता, क्योंकि कोड आधार बहुत बड़ा है और सभी कार्यक्षमता का परीक्षण करने का समय सीमित है, इसलिए अपग्रेड प्रश्न से बाहर है। मैं उम्मीद कर रहा था कि एक और अधिक सुरुचिपूर्ण समाधान था): – ComputerSaysNo

+0

मुझे लगता है कि मैंने इस प्रश्न के लिए पर्याप्त समय दिया है, आपका जवाब मेरे प्रश्न के करीब है, दुर्भाग्य से मुझे इस मुद्दे को हल करने के "लंबा रास्ता" जाना है, जिसका अर्थ है कई प्रश्न ..., आपके उत्तर के लिए धन्यवाद ( – ComputerSaysNo

4

आप एक संग्रहीत प्रक्रिया बनाने और इसे डेल्फी से कह सकते हैं:

create procedure update_generators 
as 
    declare variable max_id integer; 
    declare variable table_name char(31); 
    declare variable generator_name char(31); 
begin 
    /* assuming generator naming convention GEN_XXX -> table name XXX */ 
    for select 
    trim(g.rdb$generator_name), 
    substring(trim(g.rdb$generator_name) from 5) 
    from rdb$generators g 
    where (coalesce(g.rdb$system_flag, 0) = 0) 
    into 
    :generator_name, 
    :table_name 
    do 
    begin 
    /* assuming that the field name is always ID */ 
    execute statement 'select max(id) from ' || :table_name into :max_id; 
    execute statement 'set generator ' || :generator_name || ' to ' || :max_id; 
    end 
end^ 

ऐसा लगता है कि execute statementsupported by Firebird 1.5 पहले से ही है। फायरबर्ड 2.0 और बाद में, आप कोड को execute block में भी लपेट सकते हैं और संग्रहीत प्रक्रिया बनाने से बच सकते हैं।

+0

+1 धन्यवाद टंड्रेज, आप सही थे, GEN_TABLENAME सम्मेलन है, लेकिन मैं एक आसान समाधान – ComputerSaysNo

2
निम्नलिखित चाल अधिक से अधिक आईडी Firebird में एक SQL विवरण के साथ एक मेज के मूल्य के जनरेटर मान सेट करने के आप कर सकते हैं के साथ

:

SELECT GEN_ID(GEN_TABLENAME, 
    (SELECT MAX(ID) FROM TABLENAME) - GEN_ID(GEN_TABLENAME, 0)) FROM RDB$DATABASE; 

काम करता है यही कारण है, क्योंकि GEN_ID(<GeneratorName>, <increment>) जनरेटर मूल्य और वेतन वृद्धि में यह द्वारा हो जाता है <increment>। यह फायरबर्ड 1.5 के साथ-साथ नए संस्करणों में भी काम करना चाहिए।

+0

पसंद करता हूं यदि आप जानते हैं कि जेनरेटर 0 है, तो यह और भी आसान है: 'चुनें GEN_ID (GEN_TABLENAME, (तालिका से चुनें MAX (आईडी))) आरडीबी $ डाटाबेस से; ' – yonojoy