PL/SQL is Oracle's procedural extension to SQL while SQL is a language for querying databases and performing operations.
Cursors in PL/SQL are pointers to a result set, allowing row-by-row processing and can be explicit or implicit.
A trigger is a stored procedure that executes automatically in response to certain events on a table
Procedures perform actions and don’t return values directly, while Functions must return a single value.
Predefined exceptions like NO_DATA_FOUND, TOO_MANY_ROWS, and ZERO_DIVIDE help handle specific issues that may arise during execution.
The three main types of PL/SQL Collections are Associative Arrays, Nested Tables, and VARRAYs.
Optimizing PL/SQL code involves several practices like using bulk collect and forall for bulk operations.
The %TYPE and %ROWTYPE attributes are used to declare variables that automatically adopt the datatype of a table column or the entire row structure of a table.
A package is a collection of PL/SQL objects like procedures, functions, variables, and types grouped together.
BULK COLLECT fetches multiple rows at once into a collection, while FORALL allows performing DML operations on collections, both reducing context switching between PL/SQL and SQL.