DEV Community

Pranav Bakare
Pranav Bakare

Posted on

DBMS_SQL package | Dynamic SQL

The DBMS_SQL package in Oracle is a set of procedures and functions that allows you to work with dynamic SQL more flexibly. Unlike EXECUTE IMMEDIATE, which is typically used for simpler dynamic SQL statements, DBMS_SQL provides more control and is especially useful when you need to perform operations such as binding multiple variables, fetching result sets dynamically, or working with complex queries.

Key Features of the DBMS_SQL Package:

  1. Open a Cursor:

Allows you to open a cursor to hold a dynamic SQL query.

  1. Parse SQL:

Parses the dynamic SQL statement to prepare it for execution.

  1. Bind Variables:

Allows you to bind variables (like parameters in a query) dynamically to the SQL statement.

  1. Execute SQL:

Executes the SQL query after parsing and binding any required variables.

  1. Fetch Rows:

Fetches results dynamically into variables.

  1. Close the Cursor:

After the query execution, you must close the cursor to release resources.

Main Steps in Using DBMS_SQL:

  1. Open a Cursor:

Use DBMS_SQL.OPEN_CURSOR to open a new cursor.

  1. Parse SQL Statement:

Use DBMS_SQL.PARSE to parse the dynamic SQL statement.

  1. Bind Variables:

Use DBMS_SQL.BIND_VARIABLE to bind the actual values to placeholders (bind variables) in the SQL statement.

  1. Execute the SQL:

Use DBMS_SQL.EXECUTE to execute the SQL statement.

  1. Fetch Results:

If the query returns results, use DBMS_SQL.FETCH_ROWS to fetch and process the rows.

  1. Close the Cursor:

Finally, always close the cursor using DBMS_SQL.CLOSE_CURSOR.

Example of Using DBMS_SQL:

DECLARE
v_cursor INTEGER; -- A variable to hold the cursor
v_sql VARCHAR2(1000); -- The dynamic SQL query
v_count NUMBER; -- Variable to store the result
BEGIN
-- Define the dynamic SQL query
v_sql := 'SELECT COUNT(*) FROM employees WHERE department_id = :dept_id';

-- Open a cursor for the SQL statement
v_cursor := DBMS_SQL.OPEN_CURSOR;

-- Parse the SQL statement
DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE);

-- Bind the department ID variable
DBMS_SQL.BIND_VARIABLE(v_cursor, ':dept_id', 10);

-- Execute the SQL statement
DBMS_SQL.EXECUTE(v_cursor);

-- Fetch the result into v_count
DBMS_SQL.FETCH_ROWS(v_cursor, v_count);

-- Output the result
DBMS_OUTPUT.PUT_LINE('Number of employees in department 10: ' || v_count);

-- Close the cursor
DBMS_SQL.CLOSE_CURSOR(v_cursor);
END;

Explanation of Example:

  1. Open Cursor: DBMS_SQL.OPEN_CURSOR is used to open a cursor.

  2. Parse SQL: DBMS_SQL.PARSE prepares the SQL for execution.

  3. Bind Variables: DBMS_SQL.BIND_VARIABLE binds the dynamic value for :dept_id to 10.

  4. Execute SQL: DBMS_SQL.EXECUTE executes the SQL statement.

  5. Fetch Rows: DBMS_SQL.FETCH_ROWS retrieves the result into v_count.

  6. Close Cursor: DBMS_SQL.CLOSE_CURSOR is called to release the cursor.

When to Use DBMS_SQL:

When you need to work with complex SQL queries dynamically (e.g., changing columns, tables, or conditions).

When you need more flexibility, such as multiple bind variables or working with result sets.

When you require fine-grained control over parsing, binding, and execution that EXECUTE IMMEDIATE cannot provide.

In general, DBMS_SQL is useful for handling advanced dynamic SQL operations in Oracle, especially when dealing with more complex scenarios.

Top comments (0)