Tutorial Oracle PL / SQL Dynamic SQL: Εκτελέστε άμεση & DBMS_SQL

Πίνακας περιεχομένων:

Anonim

Τι είναι το Dynamic SQL;

Το Dynamic SQL είναι μια μεθοδολογία προγραμματισμού για τη δημιουργία και εκτέλεση δηλώσεων κατά το χρόνο εκτέλεσης. Χρησιμοποιείται κυρίως για τη σύνταξη προγραμμάτων γενικής χρήσης και ευέλικτων, όπου οι δηλώσεις SQL θα δημιουργηθούν και θα εκτελεστούν κατά το χρόνο εκτέλεσης με βάση την απαίτηση.

Σε αυτό το σεμινάριο, θα μάθετε-

  • Τρόποι σύνταξης δυναμικής SQL
  • NDS (Native Dynamic SQL) - Εκτελέστε άμεσα
  • DBMS_SQL για δυναμική SQL

Τρόποι σύνταξης δυναμικής SQL

Το PL / SQL παρέχει δύο τρόπους σύνταξης δυναμικής SQL

  1. NDS - Native Dynamic SQL
  2. DBMS_SQL

NDS (Native Dynamic SQL) - Εκτελέστε άμεσα

Το Native Dynamic SQL είναι ο ευκολότερος τρόπος για να γράψετε δυναμική SQL. Χρησιμοποιεί την εντολή «EXECUTE IMMEDIATE» για να δημιουργήσει και να εκτελέσει το SQL στο χρόνο εκτέλεσης. Αλλά για να χρησιμοποιήσετε αυτόν τον τρόπο, ο τύπος δεδομένων και ο αριθμός της μεταβλητής που πρέπει να χρησιμοποιούνται σε χρόνο εκτέλεσης πρέπει να είναι γνωστοί πριν. Δίνει επίσης καλύτερη απόδοση και λιγότερη πολυπλοκότητα σε σύγκριση με το DBMS_SQL.

Σύνταξη

EXECUTE IMMEDIATE()[INTO][USING ]
  • Η παραπάνω σύνταξη δείχνει την εντολή EXECUTE IMMEDIATE.
  • Η ρήτρα INTO είναι προαιρετική και χρησιμοποιείται μόνο εάν η δυναμική SQL περιέχει μια επιλεγμένη δήλωση που παίρνει τιμές. Ο τύπος μεταβλητής πρέπει να ταιριάζει με τον τύπο μεταβλητής της επιλεγμένης δήλωσης.
  • Η ρήτρα USING είναι προαιρετική και χρησιμοποιείται μόνο εάν η δυναμική SQL περιέχει οποιαδήποτε μεταβλητή δέσμευσης.

Παράδειγμα 1 : Σε αυτό το παράδειγμα, θα πάρουμε τα δεδομένα από τον πίνακα emp για το emp_no '1001' χρησιμοποιώντας τη δήλωση NDS.

DECLARElv_sql VARCHAR2(500);lv_emp_name VARCHAR2(50):ln_emp_no NUMBER;ln_salary NUMBER;ln_manager NUMBER;BEGINly_sql:=;SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_no=:empmo:;EXECUTE IMMEDIATE lv_sql INTO lv_emp_name,ln_emp_no:ln_salary,ln_managerUSING 1001;Dbms_output.put_line('Employee Name:‘||lv_emp_name);Dbms_output.put_line('Employee Number:‘||ln_emp_no);Dbms_output.put_line(‘Salary:'||ln_salaiy);Dbms_output.put_line('Manager ID:‘||ln_manager);END;/

Παραγωγή

Employee Name : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000

Επεξήγηση κώδικα:

  • Γραμμή κώδικα 2-6 : Δήλωση μεταβλητών.
  • Γραμμή κώδικα 8 : Διαμόρφωση του SQL κατά το χρόνο εκτέλεσης Το SQL περιέχει τη μεταβλητή bind όπου η συνθήκη ': empno'.
  • Γραμμή κώδικα 9 : Εκτέλεση του πλαισίου κειμένου SQL (το οποίο γίνεται στη γραμμή κώδικα 8) χρησιμοποιώντας την εντολή NDS "EXECUTE IMMEDIATE"
  • Οι μεταβλητές στο ρήτρα «INTO» (lv_emp_name, ln_emp_no, ln_salary, ln_manager) χρησιμοποιούνται για να κρατήσουν τις ληφθείσες τιμές από το ερώτημα SQL (emp_name, emp_no, gaji, manager)
  • Ο όρος «ΧΡΗΣΗ» δίνει τις τιμές στη μεταβλητή σύνδεσης στο ερώτημα SQL (: emp_no).
  • Γραμμή κωδικού 10-13 : Εμφάνιση των ληφθεισών τιμών.

DBMS_SQL για δυναμική SQL

Το PL / SQL παρέχει το πακέτο DBMS_SQL που σας επιτρέπει να εργαστείτε με δυναμικό SQL. Η διαδικασία δημιουργίας και εκτέλεσης του δυναμικού SQL περιέχει την ακόλουθη διαδικασία.

  • OPEN CURSOR : Η δυναμική SQL θα εκτελεστεί με τον ίδιο τρόπο όπως ένας δρομέας. Έτσι, για να εκτελέσουμε τη δήλωση SQL, πρέπει να ανοίξουμε τον κέρσορα.
  • PARSE SQL : Το επόμενο βήμα είναι η ανάλυση της δυναμικής SQL. Αυτή η διαδικασία θα ελέγξει τη σύνταξη και θα διατηρήσει το ερώτημα έτοιμο να εκτελεστεί.
  • BIND VARIABLE Τιμές : Το επόμενο βήμα είναι να αντιστοιχίσετε τις τιμές για δεσμευτικές μεταβλητές, εάν υπάρχουν.
  • DEFINE COLUMN : Το επόμενο βήμα είναι να ορίσετε τη στήλη χρησιμοποιώντας τις σχετικές θέσεις τους στην επιλεγμένη δήλωση.
  • ΕΚΤΕΛΕΣΗ : Το επόμενο βήμα είναι η εκτέλεση του αναλυμένου ερωτήματος.
  • ΤΙΜΕΣ FETCH : Το επόμενο βήμα είναι η ανάκτηση των εκτελεσμένων τιμών.
  • ΚΛΕΙΣΤΟΣ ΔΙΑΓΩΝΙΣΜΟΣ : Μόλις ληφθούν τα αποτελέσματα, ο δρομέας θα πρέπει να κλείσει.

Παράδειγμα 1 : Σε αυτό το παράδειγμα, θα πάρουμε τα δεδομένα από τον πίνακα emp για το emp_no '1001' χρησιμοποιώντας τη δήλωση DBMS_SQL.

DECLARElv_sql VARCHAR2(500);lv_emp_name VARCHAR2(50);ln_emp_no NUMBER;ln_salary NUMBER;ln_manager NUMBER;ln_cursor_id NUMBER;ln_rows_processed;BEGINlv_sql:=‘SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_no=:empmo’;in_cursor_id:=DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(ln_cursor_id,lv_sql,DBMS_SQL.NATIVE);DBMS_SQL.BIXD_VARLABLE(ln_cursor_id:‘empno‘,1001);DBMS_SQL.DEFINE_COLUMN(ln_cursor_ici,1,ln_emp_name);DBMS_SQL.DEFINE_COLUMN(ln_cursor_id,2,ln_emp_no);DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,3,ln_salary);DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,4,ln_manager);ln_rows__processed:=DBMS_SQL.EXECUTE(ln_cursor_id);
LOOPIF DBMS_SQL.FETCH_ROWS(ln_cursor_id)=0THENEXIT;ELSEDBMS_SQL.COLUMN_VALUE(ln_cursor_id,1,lv_emp_name);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,2,ln_emp_no);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,3,In_salary);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,4,In_manager);Dbms_output.put_line('Employee Name:‘||lv_emp_name);Dbms_output.put_line('Employee Number:l‘||ln_emp_no);Dbms_output.put_line(‘Salary:‘||ln_salary);Dbms_output.put_line('Manager ID :‘| ln_manager);END IF;END LOOP;DBMS_SQL.CLOSE_ClIRSOR(ln_cursor_id);END:/

Παραγωγή

Employee Name:XXXEmployee Number:1001Salary:15000Manager ID:1000

Επεξήγηση κώδικα:

  • Γραμμή κωδικού 1-9 : Δήλωση μεταβλητής.
  • Γραμμή κώδικα 10 : Διαμόρφωση της δήλωσης SQL.
  • Γραμμή κώδικα 11 : Άνοιγμα του δρομέα χρησιμοποιώντας DBMS_SQL.OPEN_CURSOR. Θα επιστρέψει το αναγνωριστικό του δρομέα που έχει ανοίξει.
  • Γραμμή κώδικα 12 : Μετά το άνοιγμα του δρομέα, το SQL αναλύεται.
  • Γραμμή κώδικα 13 : Η μεταβλητή δέσμευσης «1001» αντιστοιχεί στο αναγνωριστικό δρομέα αντί για «: empno».
  • Γραμμή κώδικα 14-17 : Ορισμός του ονόματος της στήλης με βάση τη σχετική θέση τους στη δήλωση SQL. Στην περίπτωσή μας, η σχετική θέση είναι (1) emp_name, (2) emp_no (3) μισθός (4) manager. Έτσι, βάσει αυτής της θέσης ορίζουμε τη μεταβλητή στόχου.
  • Γραμμή κώδικα 18 : Εκτέλεση του ερωτήματος χρησιμοποιώντας DBMS_SQL.EXECUTE. Επιστρέφει τον αριθμό των εγγραφών που υποβλήθηκαν σε επεξεργασία.
  • Γραμμή κωδικού 19-33 : Λήψη των εγγραφών χρησιμοποιώντας βρόχο και εμφάνιση των ίδιων.
  • Γραμμή κώδικα 20: DBMS_SQL.FETCH_ROWS θα πάρει μια εγγραφή από τις σειρές που έχουν υποβληθεί σε επεξεργασία. Μπορεί να κληθεί επανειλημμένα για τη λήψη όλων των σειρών. Εάν δεν μπορεί να πάρει σειρές, θα επιστρέψει 0, βγαίνοντας έτσι από το βρόχο.

Περίληψη

Σε αυτήν την ενότητα, έχουμε συζητήσει τη δυναμική SQL και τους τρόπους εκτέλεσης του DYNAMIC SQL. Έχουμε επίσης δει τα διαφορετικά βήματα στην εκτέλεση της δυναμικής SQL και με τους δύο τρόπους. Έχουμε δει επίσης τα παραδείγματα με τα οποία χειρίζεται το ίδιο σενάριο και με τους NDS και DBMS_SQL τρόπους εκτέλεσης εκτέλεσης στο χρόνο εκτέλεσης.