आपके डायनेमिक SQL में तीन चीज़ें गलत हैं।
- EXECUTE IMMEDIATE कोई फ़ंक्शन नहीं है:उचित सिंटैक्स
execute immediate '<<query>>' into <<variable>>
में निष्पादित करें। । - एक INSERT स्टेटमेंट में VALUES क्लॉज या सेलेक्ट होता है लेकिन दोनों नहीं। इस मामले में चयन बहुत गलत होगा। यह भी ध्यान दें कि यह VALUES है, VALUE नहीं है।
- COLUMN_NAME डायनेमिक SQL में एक स्ट्रिंग अक्षर है, इसलिए इसे उद्धरणों में होना चाहिए। लेकिन चूंकि SQL कथन स्वयं एक स्ट्रिंग है, इसलिए डायनेमिक स्ट्रिंग्स में उद्धरणों से बचने की आवश्यकता है, इसलिए यह `'''||column_name||''' होना चाहिए।
तो संशोधित संस्करण कुछ इस तरह दिखेगा
declare
Cursor C_TABLE is
select trim(table_name) as table_name
from all_tables
where table_name in ('T1', 'T2', 'T3');
V_ROWNUM number;
begin
for m in C_TABLE
loop
for i in ( select column_name
from (
select c.column_name
from all_tab_columns c
where c.table_name = m.table_name
and c.owner = 'owner1'
)
)
loop
execute immediate 'select count(*) from ' || m.table_name into V_ROWNUM;
execute immediate 'insert into MY_table values ( ''' || i.column_name || ''', ' || V_ROWNUM || ')';
end loop;
end loop;
end;
/
डायनेमिक SQL कठिन है क्योंकि यह संकलन त्रुटियों को रनटाइम त्रुटियों में बदल देता है। पहले स्टेटमेंट को स्टेटिक SQL के रूप में लिखना अच्छा अभ्यास है। एक बार जब आपको मूल सिंटैक्स सही मिल जाए तो आप इसे डायनेमिक SQL में बदल सकते हैं।