Database
 sql >> Baza danych >  >> RDS >> Database

Wstaw DML ze zmienną powiązania:UŻYWAJĄC klauzuli wykonania instrukcji natychmiastowej

Wstaw DML ze zmienną powiązania:dlaczego?

Przejdźmy do sprawy! Dwie największe zalety zmiennych wiązania to zabezpieczenie przed wstrzyknięciami SQL i zwiększenie wydajności dzięki ograniczeniu twardego parsowania. Ze względu na te zalety użycie zmiennych bind w kodzie jest nie tylko sugerowane, ale także zalecane.

Czy nie będzie wisienką na torcie, gdybyśmy mogli wymyślić sposób na wykorzystanie Bind Variables z natywnym dynamicznym SQL? Jeśli się tak zastanawiasz, moi drodzy przyjaciele, jesteś we właściwym miejscu, ponieważ zamierzamy to zrobić na tym blogu.

Co to jest zmienna powiązania?

Możemy zdefiniować zmienną bind jako zmienną, którą tworzymy w SQL*Plus, a następnie odwołujemy się w PL/SQL. Ponadto możemy zadeklarować zmienną Bind w dowolnym miejscu w środowisku hosta. Dlatego zmienne bind są również znane jako zmienne hosta.

Możesz przeczytać więcej o wiązaniu zmiennych w samouczku 6 PL/SQL.

Jak używać zmiennej wiązania z natywnym dynamicznym SQL?

Aby użyć zmiennej bind w dynamicznym SQL, musimy skorzystać z pomocy „Używanie klauzuli ” instrukcji Execute Immediate.

Co to jest instrukcja użycia klauzuli wykonania natychmiastowego?

W statycznym SQL musieliśmy określić wartość zmiennej bind po wykonaniu programu PL/SQL. Podczas gdy w Dynamicznym SQL musimy wcześniej wspomnieć o wartościach dla wszystkich zmiennych wiązania. Te same, które są używane w instrukcji SQL, które chcemy wykonać dynamicznie za pomocą Execute Immediate.

Dlatego, aby określić wartości dla wszystkich zmiennych wiązania, korzystamy z klauzuli USING instrukcji Execute Immediate Statement. Stosując klauzulę „USING”, wypisujemy wszystkie wartości dla każdej zmiennej wiążącej użytej w instrukcji SQL, którą chcemy wykonać dynamicznie.

Teraz, gdy nauczyliśmy się, czym są zmienne wiążące i używamy instrukcji Clause of Execute Immediate, zróbmy przykład.

Przykład wykonania natychmiastowego za pomocą klauzuli

W celu demonstracji wstawimy dane do tabeli. I do tego użyjemy instrukcji Execute Immediate. Ponadto, aby zwiększyć bezpieczeństwo i wydajność, będziemy używać zmiennej bind z Wstaw DML.

W tym celu będziemy potrzebować najpierw tabeli, do której możemy wstawić dane. Dlatego szybko ją stwórzmy. I jak zawsze będę utrzymywać kod tak prosty, jak to możliwe, aby ułatwić zrozumienie koncepcji.

Krok 1:Utwórz tabelę

CREATE TABLE stu_info(
    student_name    VARCHAR2 (20)
);

Krok 2:Przygotuj oświadczenie DML

Dobrą praktyką programistyczną jest wcześniejsze przygotowanie instrukcji SQL, którą chcesz wykonać za pomocą funkcji execute. W ten sposób zmniejszysz ryzyko błędów składniowych.

Ograniczenie dotyczące pisania DML for Execute Immediate pozostanie takie samo, jak w przypadku instrukcji DDL. Podobnie jak instrukcja DDL, instrukcja DML nie powinna być zakończona średnikiem. Dlatego pamiętając o tym, napiszmy instrukcję INSERT.

INSERT INTO stu_info (student_name) VALUES (:stu_name)

W standardowym INSERT DML zwykle zapisujemy dane w nawiasach klauzuli wartości. Ponadto po wykonaniu dane te zostaną wstawione do odpowiedniej kolumny. Ale jak widać, tutaj użyliśmy zmiennej wiążącej „:stu_name” zamiast stałego kodowania dowolnej określonej wartości do wstawienia do tabeli.

Krok 3:Napisz kod PL/SQL

Ostatnim krokiem w cyklu jest uruchomienie INSERT DML ze zmienną bind poprzez zastosowanie klauzuli USING w Execute Immediate Statement of Native Dynamic SQL.

SET SERVEROUTPUT ON;
DECLARE
    sql_smt VARCHAR2 (150);
BEGIN
    sql_smt :=  'INSERT INTO stu_info (student_name) VALUES (:stu_name)';
    EXECUTE IMMEDIATE sql_smt USING 'Steve';
END;
/

Rozumiemy, co się stanie po wykonaniu tego bloku PL/SQL. Kiedy uruchomisz ten program, silnik PL/SQL zastąpi tę wartość „Steve” w miejsce zmiennej bind :stu_name, a następnie wykona INSERT DML, który wstawi tę wartość do wspomnianej tabeli.

Ponadto jest kilka rzeczy, o które musisz zadbać podczas pisania powyższego programu PL/SQL na swoim końcu.

  1. Upewnij się, że instrukcja INSERT DML lub Any SQL, którą chcesz uruchomić za pomocą funkcji Execute Immediate, należy umieścić w jednej parze w pojedynczym cudzysłowie. Pamiętaj też, aby zakończyć instrukcję przypisania (wiersz 5) oraz instrukcję Execute Immediate średnikiem.
  2. Wartość przypisywana do zmiennej wiązania za pomocą klauzuli USING musi być taka sama lub zgodna z typem danych kolumny tabeli, do której ją wstawiasz. Na przykład w naszym przypadku wstawiamy nazwę „Steve”, która jest ciągiem znaków w kolumnie nazwa_ucznia tabeli stu_info, która ma typ danych Varchar2. Typ danych znakowych jest bardzo kompatybilny z typem danych Varchar2.

Dzięki temu programowi nauczyliśmy się dwóch bardzo ważnych rzeczy.

  1. Jak używać INSERT DML z natychmiastowym wykonywaniem dynamicznego SQL i
  2. Jak zastosować klauzulę USING do przypisywania wartości do zmiennej bind używanej w zapytaniu SQL, które chcemy uruchomić dynamicznie.

Ponadto koniecznie sprawdź wideo, ponieważ omówiłem tam, jak poradzić sobie z błędem „ORA-01008:Not All Variables Bound”. Założę się, że nie chcesz przegapić rozwiązania tego błędu, ponieważ jest to bardzo ważne z punktu widzenia certyfikacji bazy danych Oracle.

Bądź też na bieżąco, ponieważ w następnym samouczku dowiemy się, jak radzić sobie z wieloma zmiennymi wiązania, stosując klauzulę Using of execute w Oracle Database.

Mam nadzieję, że z tego bloga dowiedziałeś się czegoś wartościowego. W międzyczasie podziel się nim ze znajomymi na Facebooku, Twitterze, WhatsApp lub innym wygodnym dla Ciebie medium. Zasubskrybuj również mój kanał na YouTube, aby uzyskać więcej szybkich i interesujących samouczków. Dzięki i życzę miłego dnia!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. FieldShield SDK

  2. Porównywanie obiektów według wartości. Część 6:Wdrażanie równości struktury

  3. Wykonywanie audytu zmian danych przy użyciu tabeli czasowej

  4. Notacja Barkera

  5. =) Operator dla początkujących