sql >> Database teknologi >  >> RDS >> Oracle

Oracle PL/SQL:Dynamisk SQL-eksempel ved hjælp af Execute Immediate

I denne øvelse giver jeg et Oracle PL/SQL-programeksempel for at demonstrere dynamisk SQL ved hjælp af EXECUTE IMMEDIATE-sætning.

Oracle PL/SQL UDFØR STRAKS Dynamisk SQL-eksempel

Følgende PL/SQL-procedure vil opdatere posten i tabellen Medarbejdere for et medarbejder-id, hvis en værdi er forskellig fra den faktiske værdi.

Update-sætningen vil blive forberedt dynamisk ved hjælp af en streng, og derefter vil den blive udført ved hjælp af EXECUTE IMMEDIATE-sætningen. SQL-sætningen vil kun blive lavet for de parametre, der er bestået og har nye værdier.

For eksempel, hvis du ønsker at opdatere fornavnet og lønnen for medarbejderen, så send værdierne for parameter i_id, fornavn og i_salary, hvileparameter kan være null. Opdateringserklæringen vil kun blive genereret for disse kolonner.

CREATE OR REPLACE PROCEDURE update_emp_rec (
   i_id               IN employees.employee_id%TYPE,
   i_first            IN employees.first_name%TYPE,
   i_last             IN employees.last_name%TYPE,
   i_email            IN employees.email%TYPE,
   i_phone            IN employees.phone_number%TYPE,
   i_job              IN employees.job_id%TYPE,
   i_salary           IN employees.salary%TYPE,
   i_commission_pct   IN employees.commission_pct%TYPE,
   i_manager_id       IN employees.manager_id%TYPE,
   i_department_id    IN employees.department_id%TYPE)
AS
   emp_upd_rec   employees%ROWTYPE;

   sql_string    VARCHAR2 (1000);

   set_count     NUMBER := 0;
BEGIN
   SELECT *
     INTO emp_upd_rec
     FROM employees
    WHERE employee_id = i_id;

   sql_string := 'UPDATE EMPLOYEES SET ';

   IF i_first != emp_upd_rec.first_name
   THEN
      IF set_count > 0
      THEN
         sql_string := sql_string || ', FIRST_NAME =''' || i_first || '''';
      ELSE
         sql_string := sql_string || ' FIRST_NAME =''' || i_first || '''';
         set_count := set_count + 1;
      END IF;
   END IF;

   IF i_last != emp_upd_rec.last_name
   THEN
      IF set_count > 0
      THEN
         sql_string := sql_string || ', LAST_NAME =''' || i_last || '''';
      ELSE
         sql_string := sql_string || ' LAST_NAME =''' || i_last || '''';
         set_count := set_count + 1;
      END IF;
   END IF;

   IF UPPER (i_email) != emp_upd_rec.email
   THEN
      IF set_count > 0
      THEN
         sql_string := sql_string || ', EMAIL =''' || UPPER (i_email) || '''';
      ELSE
         sql_string := sql_string || ' EMAIL =''' || UPPER (i_email) || '''';
         set_count := set_count + 1;
      END IF;
   END IF;

   IF UPPER (i_phone) != emp_upd_rec.phone_number
   THEN
      IF set_count > 0
      THEN
         sql_string :=
            sql_string || ', PHONE_NUMBER =''' || UPPER (i_phone) || '''';
      ELSE
         sql_string :=
            sql_string || ' PHONE_NUMBER =''' || UPPER (i_phone) || '''';
         set_count := set_count + 1;
      END IF;
   END IF;

   IF i_job != emp_upd_rec.job_id
   THEN
      IF set_count > 0
      THEN
         sql_string := sql_string || ', JOB_ID =''' || i_job || '''';
      ELSE
         sql_string := sql_string || ' JOB_ID =''' || i_job || '''';
         set_count := set_count + 1;
      END IF;
   END IF;

   IF i_salary != emp_upd_rec.salary
   THEN
      IF set_count > 0
      THEN
         sql_string := sql_string || ', SALARY =' || i_salary;
      ELSE
         sql_string := sql_string || ' SALARY =' || i_salary;
         set_count := set_count + 1;
      END IF;
   END IF;

   IF i_commission_pct != emp_upd_rec.commission_pct
   THEN
      IF set_count > 0
      THEN
         sql_string := sql_string || ', COMMISSION_PCT =' || i_commission_pct;
      ELSE
         sql_string := sql_string || ' COMMISSION_PCT =' || i_commission_pct;
         set_count := set_count + 1;
      END IF;
   END IF;

   IF i_manager_id != emp_upd_rec.manager_id
   THEN
      IF set_count > 0
      THEN
         sql_string := sql_string || ', MANAGER_ID =' || i_manager_id;
      ELSE
         sql_string := sql_string || ' MANAGER_ID =' || i_manager_id;
         set_count := set_count + 1;
      END IF;
   END IF;

   IF i_department_id != emp_upd_rec.department_id
   THEN
      IF set_count > 0
      THEN
         sql_string := sql_string || ', DEPARTMENT_ID =' || i_department_id;
      ELSE
         sql_string := sql_string || ' DEPARTMENT_ID =' || i_department_id;
         set_count := set_count + 1;
      END IF;
   END IF;

   sql_string := sql_string || ' WHERE employee_id = ' || i_id;

   IF set_count > 0
   THEN
      DBMS_OUTPUT.put_Line (sql_string);

      EXECUTE IMMEDIATE sql_string;
   ELSE
      DBMS_OUTPUT.PUT_LINE (
         'No update needed, ' || 'all fields match original values');
   END IF;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      DBMS_OUTPUT.PUT_LINE ('No matching employee found');
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE(   'Data entry error has occurred, '
                           || 'please check values and try again'
                           || sql_string);
END;
/

Kør proceduren

Følgende er PL/SQL-koden for at udføre ovenstående procedure for at opdatere fornavnet og lønnen for medarbejder-ID 199.

SET SERVEROUTPUT ON;

DECLARE
   I_ID               NUMBER;
   I_FIRST            VARCHAR2 (20);
   I_LAST             VARCHAR2 (25);
   I_EMAIL            VARCHAR2 (25);
   I_PHONE            VARCHAR2 (20);
   I_JOB              VARCHAR2 (10);
   I_SALARY           NUMBER;
   I_COMMISSION_PCT   NUMBER;
   I_MANAGER_ID       NUMBER;
   I_DEPARTMENT_ID    NUMBER;
BEGIN
   I_ID := 199;
   I_FIRST := 'Joseph';
   I_LAST := NULL;
   I_EMAIL := NULL;
   I_PHONE := NULL;
   I_JOB := NULL;
   I_SALARY := 3099;
   I_COMMISSION_PCT := NULL;
   I_MANAGER_ID := NULL;
   I_DEPARTMENT_ID := NULL;

   UPDATE_EMP_REC (I_ID,
                   I_FIRST,
                   I_LAST,
                   I_EMAIL,
                   I_PHONE,
                   I_JOB,
                   I_SALARY,
                   I_COMMISSION_PCT,
                   I_MANAGER_ID,
                   I_DEPARTMENT_ID);
   COMMIT;
END;
/

Output

UPDATE EMPLOYEES SET FIRST_NAME ='Joseph', SALARY =3099 WHERE employee_id = 199
PL/SQL procedure successfully completed.

Se også:

  • Hvordan afkortes tabel i Oracle-proceduren?
  • Oracle Dynamic SQL-eksempel til at indsætte en post ved hjælp af DBMS_SQL
  • Hvordan udskriver man 1 til 10 uden at bruge Loop i PL/SQL?
  1. Ændre tidszoneforskydningen på en datotidsforskydningsværdi i SQL Server (T-SQL)

  2. Hvorfor er usigneret heltal ikke tilgængelig i PostgreSQL?

  3. Hvordan kan jeg bruge PDO til at hente et resultatarray i PHP?

  4. Tekstkomprimering i PostgreSQL