आप EXECUTE IMMEDIATE
. में अर्धविराम का उपयोग नहीं कर सकते सिंगल स्टेटमेंट के लिए
यहां दस्तावेज़ीकरण से एक उद्धरण दिया गया है :
EXECUTE IMMEDIATE
. से अर्धविराम हटाएं ।
execute immediate 'create table smap1(nam varchar2(10));'; -- this is your code
execute immediate 'create table smap1(nam varchar2(10))'; -- correct code, no semicolon at end
लेकिन एक और समस्या है।
आपको यह समझने की आवश्यकता है कि प्रतिस्थापन चर (&variable
. कैसे होते हैं ) काम करता है
SQL*Plus केवल एक बार प्रतिस्थापन चर के लिए संकेत देगा:स्क्रिप्ट के संकलन से ठीक पहले, इसे चलाने से पहले। और फिर वेरिएबल्स को स्क्रिप्ट में शब्दशः बदल दिया जाता है, जिसके बाद इसे संकलित और निष्पादित किया जाएगा।
उदाहरण के लिए, जब आप अपनी स्क्रिप्ट चलाते हैं, तो SQL*Plus यह मानता है कि दो अज्ञात अक्षर हैं (&colname
और &coldata
), और आपके लिए संकेत देगा। अगर आप उनके लिए 'आयु' और 'नंबर' मान देते हैं, तो SQL*Plus इस तरह स्क्रिप्ट को फिर से लिखेगा:
declare
-- omitted to add clarity
begin
execute immediate 'create table smap1(nam varchar2(10));';
if(no_of_cols>=2) then
for i in 2..no_of_cols loop
colname:=age;
coldata:=number;
execute immediate 'alter table smapl add '||colname||' '||coldata;
end loop;
end if;
end;
इसलिए यदि आप एक चर के लिए एक स्ट्रिंग अक्षर निर्दिष्ट करना चाहते हैं, और आप उस स्ट्रिंग को एक प्रतिस्थापन चर से प्राप्त करना चाहते हैं, तो आपको यह करने की आवश्यकता है:
colname varchar2(30) := '&colname'; -- notice the single quotes
मान लें कि आपने colname
. के लिए 'आयु' प्रदान की है एसक्यूएल*प्लस खुशी-खुशी इसे इसमें बदल देगा:
colname varchar2(30) := 'age';
इसलिए, लूप के अंदर एक प्रतिस्थापन चर रखने से SQL*Plus बार-बार आपको इसके मूल्य के लिए संकेत नहीं देगा ।