Static vs. Dynamic SQL
استفاده از SQL در اپلیکیشن های DB2 از طریق Static SQL یا Dynamic SQL انجام می شود. در این مقاله با این مفاهیم آشنا می شویم و تفاوت آن ها را درک خواهیم کرد.
Static SQL:
بیشتر اپلیکیشن های DB2 از این نوع SQL استفاده می کنند. Static SQL یک statement کامل و آماده ی اجرا می باشد که درون برنامه به طور مشخص نوشته شده و قابل تغییر نیست.
Static SQL بسیار کاربردی و قدرتمند است و همه ی دستورات SQL را می شود به صورت static درون برنامه کددهی کرد. این نوع SQL به میزان کافی انعطاف پذیر می باشد و بیشتر برنامه نویسان هیچ وقت به انواع دیگر SQL نیاز پیدا نمی کنند.
Dynamic SQL:
این نوع از SQL به وسیله ی variable های برنامه ی اصلی نوشته می شوند و در حین اجرای برنامه قابل تغییر می باشند. در ورژن های ابتدایی DB2 استفاده از Dynamic SQL زحمت زیادی داشت و هم از نظر کددهی و هم Performance برای سیستم به صرفه نبود. اما اکنون با تغییراتی که در ابزارهای Development انجام شده و انعطاف پذیری بیشتر زبان های برنامه نویسی و DB2 از دستورات Dynamic به صورت گسترده استفاده می شود.
جهت مطالعه ی مفاهیم پایگاه داده DB2، بر روی این لینک کلیک کنید.
تفاوت های اصلی Dynamic SQL و Static SQL :
- اساسی ترین تفاوتی که این دو نوع SQL دارند، در اسم آن ها مشخص می باشد. همانطور که گفتیم، Static SQL غیر قابل تغییر می باشد. به این معنی که لیست فیلدهای Select، اسم جدول، شرط و … ثابت می باشند. اگر دستور زیر را در کد اپلیکیشن خود استفاده کنید، یک Static SQL می باشد:
به این دلیل این دستور Static است که همه ی اجزای آن به صورت ثابت نوشته شده و دستور به طور واضح به ستون ها، جدول و شرط مشخصی اشاره می کند و قابل تغییر نیست.
در صورتی که اگر این اجزا به صورت variable های برنامه نوشته شوند، Dynamic است و دستور کامل در حین اجرای برنامه ساخته می شود. به عنوان مثال اگر در برنامه ی خود مشابه کد زیر را وارد کنید، یک Dynamic SQL است:
در این مثال، اسم جدول به صورت متغیر نوشته شده است که طبق روند برنامه و بر اساس value اختصاص یافته به این متغیر، دستور SQL شما ساخته می شود.
- تفاوت مهم دیگر Dynamic و Static در bind شدن آن هاست. زمانی که شما از Static SQL استفاده می کنید، SQL شما به همراه برنامه bind می شود و از آنجایی که Static SQL در طول برنامه تغییر نمی کند بنابراین Access Path آن از قبل آماده می باشد. واضح است که این مورد درباره ی Dynamic SQL صدق نمی کند. اگر دستور SQL هنوز ساخته نشده پس چطور می شود از قبل برای آن Access Path تعیین کرد؟!؟ مشخصا این امکان وجود ندارد، بنابراین plan ساخته شده برای اپلیکیشن دارای اطلاعات Access Path نمی باشد.
آیا Dynamic SQL به bind نیاز دارد؟
این نوع دستورات Bind نمی شوند اما در زمان اجرای برنامه باید Prepare شوند. دستور PREPARE در عمل به عنوان Bind برای دستورات Dynamic عمل می کند. برنامه ی شما قبل از اجرای دستور SQL یک دستور PREPARE اجرا می کند که Access Path آن را تعیین می کند.
جهت مطالعه ی بیشتر در این خصوص به زبان انگلیسی می توانید از لینک زیر استفاده کنید: