Neden ddl deyimini doğrudan PL / SQL bloğuna yazamıyoruz


11

Neden ddl deyimlerini doğrudan PL / SQL bloğuna yazamıyoruz, örneğin yazarken

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name; // error
END test;
/

Fakat,

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    execute immediate 'truncate table table_name'; // works fine
END test;
/

Neden ikincisi başarıyla idam edildi?


Yanıtlar:


7

O dediği gibi belgeler :

PL / SQL program birimlerinde yalnızca dinamik SQL aşağıdaki türde ifadeleri yürütebilir:

  • CREATE, DROP, GRANT ve REVOKE gibi veri tanımlama dili (DDL) ifadeleri

Bir TRUNCATEişlem DDL.

Kullanırken EXECUTE IMMEDIATE, DDLyürüttüğünüz tüm işlemlerin örtük COMMITolarak geçerli işlemi yapacağını unutmayın .


1

PL / SQL kodu içindeki DDL, gerçek ihtiyaçtan daha istisnadır. Ayrıştırma, yapınız yürütme sırasında değişirse kaybolan yapı doğrulaması olarak görülebilir. Prosedürlerin diğer nesnelerin (tablolar veya diğer pl / sql kodu, görünümler vb.) Tekrar ayrıştırılması amaçlanmıştır. Nesneye bağlı olarak her değiştiğinde yeniden derlenmelidir. Bu nedenle, değişiklik yapısından başka bir şeyin ayrıştırılmış kodunun yapılması doğrulanamaz ve bu şekilde derlenir. Davayı düşünün

DROP TABLE T1;

Ayrıştırma süresi boyunca tablo bulunacak ve prosedür başarıyla derlenecek, ancak 1. yürütmede tablo bırakılmış ve kodunuz artık geçerli değil (DROP TABLE bir dahaki sefere hataya neden olacaktır). Benzer şekilde, DDL tablosundaki herhangi bir değişiklik yeniden derleme ihtiyacı yaratarak kod ayrıştırma avantajını kaybeder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.