Oracle Dynamic SQL 100 Programs

Basic DDL Operations

1. Create a Table Dynamically

Description: This example creates a table at runtime using EXECUTE IMMEDIATE.

BEGIN
    EXECUTE IMMEDIATE 'CREATE TABLE test_table (id NUMBER, name VARCHAR2(50))';
END;
/

2. Drop a Table Dynamically

Description: This example removes a table dynamically.

BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE test_table';
END;
/

3. Add a Column to a Table Dynamically

Description: This example adds a new column to an existing table.

BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE test_table ADD (created_date DATE)';
END;
/

4. Drop a Column from a Table Dynamically

Description: This example drops a column dynamically.

BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE test_table DROP COLUMN created_date';
END;
/

5. Rename a Table Dynamically

Description: This example renames a table at runtime.

BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE test_table RENAME TO new_test_table';
END;
/

6. Create an Index Dynamically

Description: This example creates an index dynamically.

BEGIN
    EXECUTE IMMEDIATE 'CREATE INDEX idx_name ON test_table(name)';
END;
/

7. Drop an Index Dynamically

Description: This example drops an index dynamically.

BEGIN
    EXECUTE IMMEDIATE 'DROP INDEX idx_name';
END;
/

8. Create a Sequence Dynamically

Description: This example creates a sequence dynamically.

BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 1';
END;
/

9. Drop a Sequence Dynamically

Description: This example drops a sequence dynamically.

BEGIN
    EXECUTE IMMEDIATE 'DROP SEQUENCE test_seq';
END;
/

10. Create a View Dynamically

Description: This example creates a view at runtime.

BEGIN
    EXECUTE IMMEDIATE 'CREATE VIEW test_view AS SELECT * FROM test_table';
END;
/

Basic DML Operations

11. Insert Data Dynamically

Description: This example inserts a row dynamically into a table.

BEGIN
    EXECUTE IMMEDIATE 'INSERT INTO test_table (id, name) VALUES (1, ''John'')';
END;
/

12. Update Data Dynamically

Description: This example updates table data dynamically.

BEGIN
    EXECUTE IMMEDIATE 'UPDATE test_table SET name = ''Jane'' WHERE id = 1';
END;
/

13. Delete Data Dynamically

Description: This example deletes a row dynamically.

BEGIN
    EXECUTE IMMEDIATE 'DELETE FROM test_table WHERE id = 1';
END;
/

14. Merge Data Dynamically

Description: This example merges data dynamically using MERGE.

BEGIN
    EXECUTE IMMEDIATE '
        MERGE INTO test_table t
        USING (SELECT 1 AS id, ''Jane'' AS name FROM dual) s
        ON (t.id = s.id)
        WHEN MATCHED THEN UPDATE SET t.name = s.name
        WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name)';
END;
/

15. Truncate a Table Dynamically

Description: This example truncates a table dynamically.

BEGIN
    EXECUTE IMMEDIATE 'TRUNCATE TABLE test_table';
END;
/

16. Insert Data with Bind Variables

Description: This example inserts a row using bind variables.

DECLARE
    v_id NUMBER := 2;
    v_name VARCHAR2(50) := 'Doe';
BEGIN
    EXECUTE IMMEDIATE 'INSERT INTO test_table (id, name) VALUES (:1, :2)' USING v_id, v_name;
END;
/

17. Update Data with Bind Variables

Description: This example updates a row using bind variables.

DECLARE
    v_id NUMBER := 2;
    v_name VARCHAR2(50) := 'Smith';
BEGIN
    EXECUTE IMMEDIATE 'UPDATE test_table SET name = :1 WHERE id = :2' USING v_name, v_id;
END;
/

18. Delete Data with Bind Variables

Description: This example deletes a row using bind variables.

DECLARE
    v_id NUMBER := 2;
BEGIN
    EXECUTE IMMEDIATE 'DELETE FROM test_table WHERE id = :1' USING v_id;
END;
/

19. Select Data Dynamically into a Variable

Description: This example fetches a value dynamically into a variable.

DECLARE
    v_name VARCHAR2(50);
BEGIN
    EXECUTE IMMEDIATE 'SELECT name FROM test_table WHERE id = 1' INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

20. Count Records Dynamically

Description: This example counts rows dynamically.

DECLARE
    v_count NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM test_table' INTO v_count;
    DBMS_OUTPUT.PUT_LINE('Count: ' || v_count);
END;
/

Dynamic Queries

21. Dynamic Query with WHERE Clause

Description: This example runs a dynamic query with a bind variable in the WHERE clause.

DECLARE
    v_id NUMBER := 1;
    v_name VARCHAR2(50);
BEGIN
    EXECUTE IMMEDIATE 'SELECT name FROM test_table WHERE id = :1' INTO v_name USING v_id;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

22. Dynamic Query with IN Clause

Description: This example uses a dynamic query with an IN clause.

DECLARE
    v_name VARCHAR2(50);
BEGIN
    EXECUTE IMMEDIATE 'SELECT name FROM test_table WHERE id IN (1, 2)' INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

23. Dynamic Query with LIKE Clause

Description: This example searches rows dynamically using a LIKE condition.

DECLARE
    v_name VARCHAR2(50);
BEGIN
    EXECUTE IMMEDIATE 'SELECT name FROM test_table WHERE name LIKE ''%John%''' INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

24. Dynamic Query with ORDER BY Clause

Description: This example orders data dynamically before fetching a value.

DECLARE
    v_name VARCHAR2(50);
BEGIN
    EXECUTE IMMEDIATE 'SELECT name FROM test_table ORDER BY id DESC' INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

25. Dynamic Query with GROUP BY Clause

Description: This example groups rows dynamically and returns an aggregate result.

DECLARE
    v_count NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'SELECT COUNT(*), name FROM test_table GROUP BY name' INTO v_count;
    DBMS_OUTPUT.PUT_LINE('Count: ' || v_count);
END;
/

26. Dynamic Query with HAVING Clause

Description: This example filters grouped results dynamically using HAVING.

DECLARE
    v_count NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'SELECT COUNT(*), name FROM test_table GROUP BY name HAVING COUNT(*) > 1' INTO v_count;
    DBMS_OUTPUT.PUT_LINE('Count: ' || v_count);
END;
/

27. Dynamic Query with JOIN Clause

Description: This example joins tables dynamically and returns a value.

DECLARE
    v_name VARCHAR2(50);
BEGIN
    EXECUTE IMMEDIATE 'SELECT t1.name FROM test_table t1 JOIN another_table t2 ON t1.id = t2.id' INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

28. Dynamic Query with SUBQUERY

Description: This example uses a subquery inside dynamic SQL.

DECLARE
    v_name VARCHAR2(50);
BEGIN
    EXECUTE IMMEDIATE 'SELECT name FROM test_table WHERE id = (SELECT MAX(id) FROM test_table)' INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

29. Dynamic Query with CASE Statement

Description: This example returns a value based on a CASE expression.

DECLARE
    v_result VARCHAR2(50);
BEGIN
    EXECUTE IMMEDIATE 'SELECT CASE WHEN id = 1 THEN ''One'' ELSE ''Other'' END FROM test_table WHERE id = 1' INTO v_result;
    DBMS_OUTPUT.PUT_LINE('Result: ' || v_result);
END;
/

30. Dynamic Query with Aggregation

Description: This example calculates an aggregate value dynamically.

DECLARE
    v_avg NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'SELECT AVG(id) FROM test_table' INTO v_avg;
    DBMS_OUTPUT.PUT_LINE('Average ID: ' || v_avg);
END;
/

Dynamic PL/SQL Blocks

31. Dynamic PL/SQL Block to Create and Populate a Table

Description: This example executes a nested dynamic PL/SQL block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            EXECUTE IMMEDIATE ''CREATE TABLE temp_table (id NUMBER, name VARCHAR2(50))'';
            EXECUTE IMMEDIATE ''INSERT INTO temp_table (id, name) VALUES (1, ''Test'')'';
        END;';
END;
/

32. Dynamic PL/SQL Block to Update and Commit

Description: This example updates data and commits inside a dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            UPDATE test_table SET name = ''Updated Name'' WHERE id = 1;
            COMMIT;
        END;';
END;
/

33. Dynamic PL/SQL Block with EXCEPTION Handling

Description: This example handles errors inside a dynamic PL/SQL block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            UPDATE test_table SET name = ''Updated'' WHERE id = 1;
            COMMIT;
        EXCEPTION
            WHEN OTHERS THEN
                ROLLBACK;
        END;';
END;
/

34. Dynamic PL/SQL Block with Looping

Description: This example uses a loop inside dynamic PL/SQL.

BEGIN
    EXECUTE IMMEDIATE '
        DECLARE
            v_id NUMBER := 1;
        BEGIN
            FOR i IN 1..5 LOOP
                INSERT INTO test_table (id, name) VALUES (v_id, ''Name'' || i);
                v_id := v_id + 1;
            END LOOP;
            COMMIT;
        END;';
END;
/

35. Dynamic PL/SQL Block with Conditional Logic

Description: This example uses conditional logic inside a dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        DECLARE
            v_name VARCHAR2(50);
        BEGIN
            SELECT name INTO v_name FROM test_table WHERE id = 1;
            IF v_name = ''Test'' THEN
                UPDATE test_table SET name = ''Updated Test'' WHERE id = 1;
            ELSE
                INSERT INTO test_table (id, name) VALUES (2, ''New Entry'');
            END IF;
            COMMIT;
        END;';
END;
/

36. Dynamic PL/SQL Block with Nested Blocks

Description: This example nests one PL/SQL block inside another.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            DECLARE
                v_name VARCHAR2(50);
            BEGIN
                SELECT name INTO v_name FROM test_table WHERE id = 1;
                IF v_name IS NULL THEN
                    INSERT INTO test_table (id, name) VALUES (1, ''Inserted Name'');
                END IF;
            END;
            COMMIT;
        END;';
END;
/

37. Dynamic PL/SQL Block to Create Index and Insert Data

Description: This example creates an index and inserts a row in one dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            EXECUTE IMMEDIATE ''CREATE INDEX idx_temp ON temp_table(name)'';
            INSERT INTO temp_table (id, name) VALUES (1, ''Indexed Name'');
            COMMIT;
        END;';
END;
/

38. Dynamic PL/SQL Block to Create and Use a Temporary Table

Description: This example creates a global temporary table and uses it immediately.

BEGIN
    EXECUTE IMMEDIATE '
        DECLARE
            v_count NUMBER;
        BEGIN
            EXECUTE IMMEDIATE ''CREATE GLOBAL TEMPORARY TABLE temp_table (id NUMBER, name VARCHAR2(50)) ON COMMIT DELETE ROWS'';
            EXECUTE IMMEDIATE ''INSERT INTO temp_table (id, name) VALUES (1, ''Temp'')'';
            SELECT COUNT(*) INTO v_count FROM temp_table;
            DBMS_OUTPUT.PUT_LINE(''Count: '' || v_count);
            COMMIT;
        END;';
END;
/

39. Dynamic PL/SQL Block with Dynamic DDL Statements

Description: This example combines DDL and DML inside a dynamic PL/SQL block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            EXECUTE IMMEDIATE ''CREATE TABLE dynamic_ddl_table (id NUMBER, name VARCHAR2(50))'';
            EXECUTE IMMEDIATE ''INSERT INTO dynamic_ddl_table (id, name) VALUES (1, ''DDL Test'')'';
            COMMIT;
        END;';
END;
/

40. Dynamic PL/SQL Block to Create and Drop Table

Description: This example creates a table and drops it in the same dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            EXECUTE IMMEDIATE ''CREATE TABLE temp_table (id NUMBER, name VARCHAR2(50))'';
            EXECUTE IMMEDIATE ''DROP TABLE temp_table'';
            COMMIT;
        END;';
END;
/

Working with Collections

41. Dynamic SQL with Nested Table

Description: This example returns multiple rows into a nested table using dynamic SQL.

DECLARE
    TYPE NameTable IS TABLE OF VARCHAR2(50);
    v_names NameTable;
BEGIN
    EXECUTE IMMEDIATE 'SELECT name BULK COLLECT INTO :1 FROM test_table' USING OUT v_names;
    FOR i IN 1..v_names.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(v_names(i));
    END LOOP;
END;
/

42. Dynamic SQL with VARRAY

Description: This example uses a VARRAY to store query results dynamically.

DECLARE
    TYPE NameArray IS VARRAY(10) OF VARCHAR2(50);
    v_names NameArray := NameArray();
BEGIN
    EXECUTE IMMEDIATE 'SELECT name FROM test_table WHERE ROWNUM <= 10' BULK COLLECT INTO v_names;
    FOR i IN 1..v_names.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(v_names(i));
    END LOOP;
END;
/

43. Dynamic SQL with Associative Array

Description: This example shows dynamic SQL usage with an associative array.

DECLARE
    TYPE NameAssocArray IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
    v_names NameAssocArray;
BEGIN
    EXECUTE IMMEDIATE 'SELECT ROWNUM, name FROM test_table' BULK COLLECT INTO v_names;
    FOR i IN 1..v_names.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(v_names(i));
    END LOOP;
END;
/

44. Dynamic SQL to Populate Nested Table from Dynamic Query

Description: This example populates a nested table from a dynamic query.

DECLARE
    TYPE NameTable IS TABLE OF VARCHAR2(50);
    v_names NameTable;
BEGIN
    EXECUTE IMMEDIATE 'SELECT name BULK COLLECT INTO :1 FROM test_table WHERE id > 1' USING OUT v_names;
    FOR i IN 1..v_names.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(v_names(i));
    END LOOP;
END;
/

45. Dynamic SQL with FORALL to Insert Data into a Table

Description: This example inserts collection items using FORALL and dynamic SQL.

DECLARE
    TYPE NameTable IS TABLE OF VARCHAR2(50);
    v_names NameTable := NameTable('Name1', 'Name2', 'Name3');
BEGIN
    FORALL i IN 1..v_names.COUNT
        EXECUTE IMMEDIATE 'INSERT INTO test_table (id, name) VALUES (:1, :2)' USING i, v_names(i);
    COMMIT;
END;
/

46. Dynamic SQL to Perform BULK COLLECT and FORALL in a Single Block

Description: This example combines bulk collect and forall operations dynamically.

DECLARE
    TYPE NameTable IS TABLE OF VARCHAR2(50);
    v_names NameTable;
BEGIN
    EXECUTE IMMEDIATE 'SELECT name BULK COLLECT INTO :1 FROM test_table WHERE id > 1' USING OUT v_names;
    FORALL i IN 1..v_names.COUNT
        EXECUTE IMMEDIATE 'INSERT INTO another_table (id, name) VALUES (:1, :2)' USING i, v_names(i);
    COMMIT;
END;
/

47. Dynamic SQL to Handle Collections in PL/SQL Block

Description: This example inserts each collection item dynamically inside a loop.

DECLARE
    TYPE NameTable IS TABLE OF VARCHAR2(50);
    v_names NameTable := NameTable('John', 'Doe');
    v_id NUMBER := 1;
BEGIN
    FOR i IN 1..v_names.COUNT LOOP
        EXECUTE IMMEDIATE 'INSERT INTO test_table (id, name) VALUES (:1, :2)' USING v_id, v_names(i);
        v_id := v_id + 1;
    END LOOP;
    COMMIT;
END;
/

48. Dynamic SQL to Populate Associative Array

Description: This example uses a dynamic query to populate an associative array.

DECLARE
    TYPE NameAssocArray IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
    v_names NameAssocArray;
BEGIN
    EXECUTE IMMEDIATE 'SELECT ROWNUM, name FROM test_table' BULK COLLECT INTO v_names;
    FOR i IN 1..v_names.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(v_names(i));
    END LOOP;
END;
/

49. Dynamic SQL to Merge Data from Collection into a Table

Description: This example merges collection data into a table dynamically.

DECLARE
    TYPE NameTable IS TABLE OF VARCHAR2(50);
    v_names NameTable := NameTable('John', 'Jane', 'Doe');
BEGIN
    FOR i IN 1..v_names.COUNT LOOP
        EXECUTE IMMEDIATE '
            MERGE INTO test_table t
            USING (SELECT :1 AS name FROM dual) s
            ON (t.name = s.name)
            WHEN MATCHED THEN UPDATE SET t.name = s.name
            WHEN NOT MATCHED THEN INSERT (name) VALUES (s.name)' USING v_names(i);
    END LOOP;
    COMMIT;
END;
/

50. Dynamic SQL with COLLECTION in IN Clause

Description: This example uses a collection in a dynamic filter condition.

DECLARE
    TYPE NameTable IS TABLE OF VARCHAR2(50);
    v_names NameTable := NameTable('John', 'Jane', 'Doe');
    v_count NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM test_table WHERE name IN (:1)' INTO v_count USING v_names;
    DBMS_OUTPUT.PUT_LINE('Count: ' || v_count);
END;
/

Advanced Dynamic SQL Operations

51. Dynamic SQL with Dynamic Column List

Description: This example builds a SELECT list dynamically.

DECLARE
    v_column_list VARCHAR2(100) := 'id, name';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'SELECT ' || v_column_list || ' FROM test_table';
    EXECUTE IMMEDIATE v_query;
END;
/

52. Dynamic SQL to Create and Populate a Table with User Input

Description: This example creates a table and inserts a row dynamically using variables.

DECLARE
    v_table_name VARCHAR2(50) := 'user_table';
    v_column_def VARCHAR2(100) := 'id NUMBER, name VARCHAR2(50)';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'CREATE TABLE ' || v_table_name || ' (' || v_column_def || ')';
    EXECUTE IMMEDIATE v_query;
    EXECUTE IMMEDIATE 'INSERT INTO ' || v_table_name || ' (id, name) VALUES (1, ''User'')';
END;
/

53. Dynamic SQL to Execute DDL Statements in Loop

Description: This example creates several tables dynamically inside a loop.

DECLARE
    v_query VARCHAR2(1000);
BEGIN
    FOR i IN 1..5 LOOP
        v_query := 'CREATE TABLE temp_table_' || i || ' (id NUMBER, name VARCHAR2(50))';
        EXECUTE IMMEDIATE v_query;
    END LOOP;
END;
/

54. Dynamic SQL to Create, Insert, and Select from a Table

Description: This example performs DDL, DML, and SELECT in sequence.

DECLARE
    v_query VARCHAR2(1000);
    v_name VARCHAR2(50);
BEGIN
    v_query := 'CREATE TABLE dynamic_table (id NUMBER, name VARCHAR2(50))';
    EXECUTE IMMEDIATE v_query;
    EXECUTE IMMEDIATE 'INSERT INTO dynamic_table (id, name) VALUES (1, ''Dynamic'')';
    EXECUTE IMMEDIATE 'SELECT name FROM dynamic_table WHERE id = 1' INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

55. Dynamic SQL to Perform Multiple Operations in a Single Block

Description: This example runs multiple SQL operations inside one dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            EXECUTE IMMEDIATE ''CREATE TABLE combined_table (id NUMBER, name VARCHAR2(50))'';
            EXECUTE IMMEDIATE ''INSERT INTO combined_table (id, name) VALUES (1, ''Combined'')'';
            EXECUTE IMMEDIATE ''CREATE INDEX idx_combined ON combined_table(name)'';
            EXECUTE IMMEDIATE ''DROP TABLE combined_table'';
            COMMIT;
        END;';
END;
/

56. Dynamic SQL with Bind Variables and DDL Operations

Description: This example combines DDL creation and bind-variable inserts.

DECLARE
    v_table_name VARCHAR2(50) := 'bind_table';
    v_column_def VARCHAR2(100) := 'id NUMBER, name VARCHAR2(50)';
BEGIN
    EXECUTE IMMEDIATE 'CREATE TABLE ' || v_table_name || ' (' || v_column_def || ')';
    EXECUTE IMMEDIATE 'INSERT INTO ' || v_table_name || ' (id, name) VALUES (:1, :2)' USING 1, 'Bind Test';
END;
/

57. Dynamic SQL to Create Indexes Based on Column Names

Description: This example creates an index using dynamic table and column names.

DECLARE
    v_index_name VARCHAR2(50) := 'idx_dynamic';
    v_table_name VARCHAR2(50) := 'dynamic_table';
    v_column_name VARCHAR2(50) := 'name';
BEGIN
    EXECUTE IMMEDIATE 'CREATE INDEX ' || v_index_name || ' ON ' || v_table_name || ' (' || v_column_name || ')';
END;
/

58. Dynamic SQL to Drop and Recreate a Table with Constraints

Description: This example recreates a table with constraints dynamically.

BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE constrained_table';
    EXECUTE IMMEDIATE '
        CREATE TABLE constrained_table (
            id NUMBER PRIMARY KEY,
            name VARCHAR2(50) NOT NULL,
            age NUMBER CHECK (age >= 0)
        )';
END;
/

59. Dynamic SQL to Manage Database Links

Description: This example creates and drops a database link dynamically.

DECLARE
    v_dblink_name VARCHAR2(50) := 'remote_link';
    v_username VARCHAR2(50) := 'user';
    v_password VARCHAR2(50) := 'password';
    v_host VARCHAR2(50) := 'remote_host';
BEGIN
    EXECUTE IMMEDIATE 'CREATE DATABASE LINK ' || v_dblink_name || ' CONNECT TO ' || v_username || ' IDENTIFIED BY ''' || v_password || ''' USING ''' || v_host || '''';
    EXECUTE IMMEDIATE 'DROP DATABASE LINK ' || v_dblink_name;
END;
/

60. Dynamic SQL to Create and Use Synonyms

Description: This example creates and drops a synonym dynamically.

DECLARE
    v_synonym_name VARCHAR2(50) := 'syn_dynamic';
    v_table_name VARCHAR2(50) := 'dynamic_table';
BEGIN
    EXECUTE IMMEDIATE 'CREATE SYNONYM ' || v_synonym_name || ' FOR ' || v_table_name;
    EXECUTE IMMEDIATE 'SELECT name FROM ' || v_synonym_name INTO v_table_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_table_name);
    EXECUTE IMMEDIATE 'DROP SYNONYM ' || v_synonym_name;
END;
/

61. Dynamic SQL to Manage Partitioned Tables

Description: This example creates and drops a partitioned table dynamically.

BEGIN
    EXECUTE IMMEDIATE '
        CREATE TABLE partitioned_table (
            id NUMBER,
            name VARCHAR2(50),
            created_date DATE
        )
        PARTITION BY RANGE (created_date)
        (
            PARTITION p1 VALUES LESS THAN (TO_DATE(''01-JAN-2020'', ''DD-MON-YYYY'')),
            PARTITION p2 VALUES LESS THAN (TO_DATE(''01-JAN-2021'', ''DD-MON-YYYY''))
        )';
    EXECUTE IMMEDIATE 'DROP TABLE partitioned_table';
END;
/

62. Dynamic SQL with Dynamic WHERE Clause Construction

Description: This example builds the WHERE clause dynamically.

DECLARE
    v_condition VARCHAR2(100) := 'id > 1';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'SELECT name FROM test_table WHERE ' || v_condition;
    EXECUTE IMMEDIATE v_query;
END;
/

63. Dynamic SQL to Execute Dynamic Cursor

Description: This example opens a ref cursor for a dynamic SELECT statement.

DECLARE
    v_cursor SYS_REFCURSOR;
    v_name VARCHAR2(50);
BEGIN
    OPEN v_cursor FOR 'SELECT name FROM test_table';
    LOOP
        FETCH v_cursor INTO v_name;
        EXIT WHEN v_cursor%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
    END LOOP;
    CLOSE v_cursor;
END;
/

64. Dynamic SQL with Dynamic Cursor and Parameters

Description: This example opens a ref cursor with bind parameters.

DECLARE
    v_cursor SYS_REFCURSOR;
    v_name VARCHAR2(50);
    v_id NUMBER := 1;
BEGIN
    OPEN v_cursor FOR 'SELECT name FROM test_table WHERE id = :1' USING v_id;
    LOOP
        FETCH v_cursor INTO v_name;
        EXIT WHEN v_cursor%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
    END LOOP;
    CLOSE v_cursor;
END;
/

65. Dynamic SQL to Fetch Data into PL/SQL Record

Description: This example fetches a row into a PL/SQL record.

DECLARE
    TYPE test_record IS RECORD (id NUMBER, name VARCHAR2(50));
    v_record test_record;
BEGIN
    EXECUTE IMMEDIATE 'SELECT id, name FROM test_table WHERE id = 1' INTO v_record;
    DBMS_OUTPUT.PUT_LINE('ID: ' || v_record.id || ', Name: ' || v_record.name);
END;
/

66. Dynamic SQL to Fetch Data into PL/SQL Cursor

Description: This example fetches rows from a table using a cursor.

DECLARE
    CURSOR c IS SELECT id, name FROM test_table;
    v_id NUMBER;
    v_name VARCHAR2(50);
BEGIN
    OPEN c;
    LOOP
        FETCH c INTO v_id, v_name;
        EXIT WHEN c%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('ID: ' || v_id || ', Name: ' || v_name);
    END LOOP;
    CLOSE c;
END;
/

67. Dynamic SQL to Execute a Procedure Dynamically

Description: This example calls a procedure dynamically.

BEGIN
    EXECUTE IMMEDIATE 'BEGIN my_procedure(:1); END;' USING 1;
END;
/

68. Dynamic SQL to Execute a Function and Get Return Value

Description: This example calls a function dynamically and captures its result.

DECLARE
    v_result NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'BEGIN :1 := my_function(:2); END;' USING OUT v_result, 1;
    DBMS_OUTPUT.PUT_LINE('Result: ' || v_result);
END;
/

69. Dynamic SQL to Execute Multiple Procedures in a Single Block

Description: This example executes several procedures inside one dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            my_procedure1(:1);
            my_procedure2(:2);
            my_procedure3(:3);
        END;' USING 1, 2, 3;
END;
/

70. Dynamic SQL with Conditional Execution of Procedures

Description: This example chooses one of two procedures dynamically.

DECLARE
    v_condition VARCHAR2(10) := 'YES';
BEGIN
    IF v_condition = 'YES' THEN
        EXECUTE IMMEDIATE 'BEGIN my_procedure(:1); END;' USING 1;
    ELSE
        EXECUTE IMMEDIATE 'BEGIN my_other_procedure(:1); END;' USING 1;
    END IF;
END;
/

Real-Time Use Cases

71. Dynamic SQL to Execute DDL and DML in a Single Block

Description: This example combines table creation and insert logic in one block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            EXECUTE IMMEDIATE ''CREATE TABLE temp_table (id NUMBER, name VARCHAR2(50))'';
            EXECUTE IMMEDIATE ''INSERT INTO temp_table (id, name) VALUES (1, ''Temp'')'';
            COMMIT;
        END;';
END;
/

72. Dynamic SQL to Handle Dynamic Number of Columns in a Query

Description: This example builds the column list dynamically.

DECLARE
    v_column_list VARCHAR2(100) := 'id, name';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'SELECT ' || v_column_list || ' FROM test_table';
    EXECUTE IMMEDIATE v_query;
END;
/

73. Dynamic SQL to Update Multiple Tables in a Single Transaction

Description: This example updates two tables in one dynamic PL/SQL block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            UPDATE table1 SET column1 = ''Value1'' WHERE condition1;
            UPDATE table2 SET column2 = ''Value2'' WHERE condition2;
            COMMIT;
        END;';
END;
/

74. Dynamic SQL with Dynamic Update Clause

Description: This example builds the SET clause dynamically.

DECLARE
    v_update_clause VARCHAR2(100) := 'name = ''Updated Name''';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'UPDATE test_table SET ' || v_update_clause || ' WHERE id = 1';
    EXECUTE IMMEDIATE v_query;
END;
/

75. Dynamic SQL to Perform Rollback if Error Occurs

Description: This example rolls back changes when an error occurs in the dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            UPDATE test_table SET name = ''New Name'' WHERE id = 1;
            COMMIT;
        EXCEPTION
            WHEN OTHERS THEN
                ROLLBACK;
                RAISE;
        END;';
END;
/

76. Dynamic SQL with Cursors in Dynamic PL/SQL Block

Description: This example uses a cursor inside a dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        DECLARE
            CURSOR c IS SELECT id, name FROM test_table;
            v_id NUMBER;
            v_name VARCHAR2(50);
        BEGIN
            OPEN c;
            LOOP
                FETCH c INTO v_id, v_name;
                EXIT WHEN c%NOTFOUND;
                DBMS_OUTPUT.PUT_LINE(''ID: '' || v_id || '', Name: '' || v_name);
            END LOOP;
            CLOSE c;
        END;';
END;
/

77. Dynamic SQL with COMMIT and ROLLBACK in Dynamic Block

Description: This example includes transaction control inside a dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            UPDATE test_table SET name = ''New Name'' WHERE id = 1;
            COMMIT;
        EXCEPTION
            WHEN OTHERS THEN
                ROLLBACK;
                RAISE;
        END;';
END;
/

78. Dynamic SQL to Create, Insert, and Select from Temporary Table

Description: This example creates a temporary table, inserts a row, and reads from it.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            EXECUTE IMMEDIATE ''CREATE GLOBAL TEMPORARY TABLE temp_table (id NUMBER, name VARCHAR2(50)) ON COMMIT DELETE ROWS'';
            EXECUTE IMMEDIATE ''INSERT INTO temp_table (id, name) VALUES (1, ''Temp'')'';
            EXECUTE IMMEDIATE ''SELECT name FROM temp_table WHERE id = 1'';
            COMMIT;
        END;';
END;
/

79. Dynamic SQL to Execute PL/SQL Blocks Dynamically

Description: This example executes a PL/SQL block stored in a variable.

DECLARE
    v_block VARCHAR2(1000) := 'BEGIN DBMS_OUTPUT.PUT_LINE(''Dynamic Block Execution''); END;';
BEGIN
    EXECUTE IMMEDIATE v_block;
END;
/

80. Dynamic SQL to Handle Complex Query with Multiple Joins

Description: This example runs a dynamic query with multiple joins and a filter.

DECLARE
    v_query VARCHAR2(1000);
    v_name VARCHAR2(50);
BEGIN
    v_query := 'SELECT t1.name FROM test_table t1 JOIN another_table t2 ON t1.id = t2.id WHERE t1.id = 1';
    EXECUTE IMMEDIATE v_query INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

Complex Business Scenarios

81. Dynamic SQL to Handle Dynamic Business Logic

Description: This example updates rows based on a dynamic business rule.

DECLARE
    v_logic VARCHAR2(100) := 'id = 1';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'UPDATE test_table SET name = ''New Name'' WHERE ' || v_logic;
    EXECUTE IMMEDIATE v_query;
END;
/

82. Dynamic SQL to Generate Reports Dynamically

Description: This example switches between summary and detailed report logic.

DECLARE
    v_report_type VARCHAR2(50) := 'SUMMARY';
    v_query VARCHAR2(1000);
BEGIN
    IF v_report_type = 'SUMMARY' THEN
        v_query := 'SELECT COUNT(*), name FROM test_table GROUP BY name';
    ELSE
        v_query := 'SELECT * FROM test_table';
    END IF;
    EXECUTE IMMEDIATE v_query;
END;
/

83. Dynamic SQL to Implement Dynamic Search Functionality

Description: This example searches data using a runtime-built condition.

DECLARE
    v_search_criteria VARCHAR2(100) := 'name = ''John''';
    v_query VARCHAR2(1000);
    v_name VARCHAR2(50);
BEGIN
    v_query := 'SELECT name FROM test_table WHERE ' || v_search_criteria;
    EXECUTE IMMEDIATE v_query INTO v_name;
    DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
END;
/

84. Dynamic SQL to Handle Multiple Dynamic Conditions

Description: This example combines more than one runtime condition.

DECLARE
    v_condition1 VARCHAR2(50) := 'id = 1';
    v_condition2 VARCHAR2(50) := 'name = ''John''';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'SELECT name FROM test_table WHERE ' || v_condition1 || ' AND ' || v_condition2;
    EXECUTE IMMEDIATE v_query;
END;
/

85. Dynamic SQL to Handle User-Defined Parameters

Description: This example uses a user-selected column in a dynamic query.

DECLARE
    v_parameter VARCHAR2(50) := 'id';
    v_query VARCHAR2(1000);
    v_value NUMBER := 1;
BEGIN
    v_query := 'SELECT ' || v_parameter || ' FROM test_table WHERE id = :1';
    EXECUTE IMMEDIATE v_query USING v_value;
END;
/

86. Dynamic SQL to Handle Data Validation Rules

Description: This example counts rows that satisfy a validation rule.

DECLARE
    v_rule VARCHAR2(100) := 'id > 0';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'SELECT COUNT(*) FROM test_table WHERE ' || v_rule;
    EXECUTE IMMEDIATE v_query;
END;
/

87. Dynamic SQL to Implement Audit Logging

Description: This example writes a row to an audit table dynamically.

DECLARE
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'INSERT INTO audit_log (operation, user, timestamp) VALUES (''UPDATE'', ''user1'', SYSDATE)';
    EXECUTE IMMEDIATE v_query;
END;
/

88. Dynamic SQL to Manage Complex Transactions

Description: This example uses savepoints and transaction control in a dynamic block.

BEGIN
    EXECUTE IMMEDIATE '
        BEGIN
            SAVEPOINT before_update;
            UPDATE test_table SET name = ''New Name'' WHERE id = 1;
            IF SQL%ROWCOUNT = 0 THEN
                ROLLBACK TO before_update;
            ELSE
                COMMIT;
            END IF;
        END;';
END;
/

89. Dynamic SQL to Handle Dynamic Data Transformations

Description: This example applies a runtime transformation in the SELECT list.

DECLARE
    v_transformation VARCHAR2(100) := 'UPPER(name)';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'SELECT ' || v_transformation || ' FROM test_table';
    EXECUTE IMMEDIATE v_query;
END;
/

90. Dynamic SQL to Execute Multiple Dynamic Queries in a Loop

Description: This example runs a different query for each loop iteration.

DECLARE
    v_query VARCHAR2(1000);
BEGIN
    FOR i IN 1..5 LOOP
        v_query := 'SELECT name FROM test_table WHERE id = ' || i;
        EXECUTE IMMEDIATE v_query;
    END LOOP;
END;
/

Complex Business Scenarios

91. Dynamic SQL to Implement Dynamic Pricing Rules

Description: This example updates discount logic based on a pricing rule.

DECLARE
    v_rule VARCHAR2(100) := 'price > 100';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'UPDATE product_table SET discount = 10 WHERE ' || v_rule;
    EXECUTE IMMEDIATE v_query;
END;
/

92. Dynamic SQL to Handle Dynamic Reporting Based on User Inputs

Description: This example switches between summary and detailed sales reports.

DECLARE
    v_report_type VARCHAR2(50) := 'DETAILED';
    v_query VARCHAR2(1000);
BEGIN
    IF v_report_type = 'SUMMARY' THEN
        v_query := 'SELECT COUNT(*), category FROM sales_table GROUP BY category';
    ELSE
        v_query := 'SELECT * FROM sales_table';
    END IF;
    EXECUTE IMMEDIATE v_query;
END;
/

93. Dynamic SQL to Handle Dynamic Column Updates Based on Business Rules

Description: This example updates a chosen column dynamically.

DECLARE
    v_column VARCHAR2(50) := 'status';
    v_value VARCHAR2(50) := 'APPROVED';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'UPDATE approval_table SET ' || v_column || ' = ''' || v_value || ''' WHERE id = 1';
    EXECUTE IMMEDIATE v_query;
END;
/

94. Dynamic SQL to Implement Dynamic Data Loading from External Sources

Description: This example inserts data into a target table dynamically.

DECLARE
    v_table_name VARCHAR2(50) := 'external_data_table';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'INSERT INTO ' || v_table_name || ' (id, name) VALUES (1, ''External Data'')';
    EXECUTE IMMEDIATE v_query;
END;
/

95. Dynamic SQL to Handle Multiple Dynamic Conditions for Complex Queries

Description: This example combines two runtime conditions in one query.

DECLARE
    v_condition1 VARCHAR2(50) := 'status = ''ACTIVE''';
    v_condition2 VARCHAR2(50) := 'region = ''NORTH''';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'SELECT * FROM employee_table WHERE ' || v_condition1 || ' AND ' || v_condition2;
    EXECUTE IMMEDIATE v_query;
END;
/

96. Dynamic SQL to Handle Data Cleanup and Maintenance Tasks

Description: This example deletes old records dynamically.

DECLARE
    v_condition VARCHAR2(50) := 'created_date < SYSDATE - 365';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'DELETE FROM data_table WHERE ' || v_condition;
    EXECUTE IMMEDIATE v_query;
END;
/

97. Dynamic SQL to Implement Dynamic Access Control Mechanisms

Description: This example grants privileges dynamically based on a role.

DECLARE
    v_role VARCHAR2(50) := 'ADMIN';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'GRANT SELECT, INSERT, UPDATE ON sensitive_table TO ' || v_role;
    EXECUTE IMMEDIATE v_query;
END;
/

98. Dynamic SQL to Manage Dynamic Workflows Based on User Actions

Description: This example updates workflow status based on an action.

DECLARE
    v_action VARCHAR2(50) := 'APPROVE';
    v_query VARCHAR2(1000);
BEGIN
    IF v_action = 'APPROVE' THEN
        v_query := 'UPDATE workflow_table SET status = ''APPROVED'' WHERE id = 1';
    ELSE
        v_query := 'UPDATE workflow_table SET status = ''REJECTED'' WHERE id = 1';
    END IF;
    EXECUTE IMMEDIATE v_query;
END;
/

99. Dynamic SQL to Handle Complex Data Migrations

Description: This example copies data from one table to another dynamically.

DECLARE
    v_source_table VARCHAR2(50) := 'old_table';
    v_target_table VARCHAR2(50) := 'new_table';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'INSERT INTO ' || v_target_table || ' SELECT * FROM ' || v_source_table;
    EXECUTE IMMEDIATE v_query;
END;
/

100. Dynamic SQL to Implement Real-Time Data Synchronization

Description: This example synchronizes source and target tables using MERGE.

DECLARE
    v_source_table VARCHAR2(50) := 'source_table';
    v_target_table VARCHAR2(50) := 'target_table';
    v_query VARCHAR2(1000);
BEGIN
    v_query := 'MERGE INTO ' || v_target_table || ' t USING ' || v_source_table || ' s ON (t.id = s.id) WHEN MATCHED THEN UPDATE SET t.name = s.name WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name)';
    EXECUTE IMMEDIATE v_query;
END;
/

Note: A few examples are intentionally educational and may need small adjustments before running in a real Oracle environment.

No comments:

Post a Comment