- a better transaction system
- packages
- Cursor For Loops
- anchored declarations (variables declared as table.column%type)
- initial values for variable declarations
- %rowtype variables
- much lower overhead for cursors
- BEFORE triggers
- FOR EACH ROW triggers
- While sequences require either discipline or before each row triggers, they are more flexible than SQL Server identity columns.
- Transact-SQL is just one language, so you don't have to worry about what's SQL, what's SQL*PLUS and what's PL/SQL.
- Because T-SQL is just one language, the T-SQL collections actually work decently with SQL. You can join T-SQL table variables to real tables. This tends to mean, while PL/SQL is more powerful for procedural programming, you just don't need to do procedural programming in T-SQL.
- If you perform a select query with no target, the results are automatically returned to the client. For production code, this means you don't need to declare and pass sys_refcursor. For ad-hoc research work, this means you can easily make scripts that perform lookups and display multiple recordsets.
- SQL Server Management Studio is much better than SQL*Plus or SQL Developer. Because it just displays any returned recordsets, data retrieval procedures are very easy to test.
- easier client connectivity setup (nothing as bad as tnsnames)
- less confusion about what drivers to use, apart from JDBC
- Declare a column "Int Identity Not Null Primary Key" and then you can forget about it.
- Every variable name starts with an "@" sigil, which looks terrible, but prevents name collisions between variables and columns.
- The case you declared a table or column with will be remembered, but it's not case sensitive, and you aren't limited to 30 characters.
- Crystal Reports can call SQL Server stored procedures, where you tend to be forced into a view with Oracle.