SlideShare a Scribd company logo
Carlos Oliveira / July 23, 2014
Agenda
 Code Refactoring – From anonymous block to
procedure
 Introduction
 Quote
 Code Refactoring
 Benefits
 Next Steps
 Training & Reference
 Thank You
Introduction
I am a forward-looking Information Systems Architect with a
solid Oracle DBA background comprising the daily
infrastructure tasks of the DBA, several projects as a Data
Modeler, and performance management projects.
I Started on the mainframe business, and soon had a deep dive
in application development for Oracle databases. After
acquiring an Oracle certification, I worked on performance
enhancement for applications using Oracle databases, and later
worked several years as an infrastructure DBA, later I worked
on data modeling projects and more recently a performance
management project, on both application and database layers.
“The limits of my language
mean the limits of my world.”
Ludwig Wittgenstein
Code Refactoring
Script_text_file_01.sql – file contents below
DECLARE
/********************************************************
Description: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Changed: xx/xx/xxxx
Changed By: xxxxxxx
********************************************************/
v_msg_text VARCHAR2(4000);
v_msg_num NUMBER(10) := 0;
BEGIN
v_msg_text := 'Procedure executed';
v_msg_num := 1;
END;
/
quit
Code Refactoring
CREATE OR REPLACE PROCEDURE DB_USER.PROC_NAME IS
/********************************************************
Description: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Changed: xx/xx/xxxx
Changed By: xxxxxxx
********************************************************/
v_msg_text VARCHAR2(4000);
v_msg_num NUMBER(10) := 0;
BEGIN
v_msg_text := 'Procedure executed';
v_msg_num := 1;
END;
/
Script_text_file_01.sql new
BEGIN
DB_USER.PROC_NAME;
END;
/
quit
Since the code is now stored in
the database, the
Script_text_file_01.sql only
contains the call to the
procedure.
Benefits
Compilation
• Most of the code is already compiled – only caller script remains
Memory
• Reduced memory usage
• Faster load
Tracking
• Code can be tracked inside DB
• Explicit dependency – change in related objects are flagged
Reuse
• Code is ready to be reused
• Change in central stored object is immediate for all calling scripts
Security
• Code can be included in database backup/restore
• Access to code restricted by database privileges
Next Steps
Modularization
• Identification of common code for grouping, organization or creation of internal
or even external procedures
• Encapsulation of complex code in procedures of functions
Error Control
• Inclusion of an Exception section for each code block
• Use of user-created exceptions
• Creation of common exception procedures
Best Practices
• Variable initialization
• Eliminate hard-code
And much more …
Training
• Performance Tuning Guide and Reference
 http://docs.oracle.com/cd/B10500_01/server.920/a96533/toc.htm
• SQL Reference
 http://docs.oracle.com/cd/B10500_01/server.920/a96540/toc.htm
• PL/SQL User's Guide and Reference
 http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/toc.htm
Resources at Oracle website
Thank you
Carlos Oliveira / July 23, 2014
Ad

Recommended

Websphere - Introduction to jdbc
Websphere - Introduction to jdbc
Vibrant Technologies & Computers
 
Websphere - Introduction to SSL part 1
Websphere - Introduction to SSL part 1
Vibrant Technologies & Computers
 
Websphere - Intoduction to Unicode websphere
Websphere - Intoduction to Unicode websphere
Vibrant Technologies & Computers
 
Websphere - Introduction to logs and configuration
Websphere - Introduction to logs and configuration
Vibrant Technologies & Computers
 
Hierarchical architecture
Hierarchical architecture
brigeit
 
5 Ways to Make Your Postgres GDPR-Ready
5 Ways to Make Your Postgres GDPR-Ready
EDB
 
Bfc Presentation
Bfc Presentation
Herea Adrian
 
Thick client pentesting_the-hackers_meetup_version1.0pptx
Thick client pentesting_the-hackers_meetup_version1.0pptx
Anurag Srivastava
 
Cqrs.frameworks
Cqrs.frameworks
Agata Piórkowska
 
Clean Architecture
Clean Architecture
Zahra Heydari
 
CLR Stored Procedures
CLR Stored Procedures
Harshana Weerasinghe
 
Bottlenecks in Java Applications
Bottlenecks in Java Applications
GlobalLogic Ukraine
 
Rundeck Office Hours: Best Practices for Access Control Policies
Rundeck Office Hours: Best Practices for Access Control Policies
TraciMyers6
 
Architecture Proposition For Multimedia repository
Architecture Proposition For Multimedia repository
McRaken
 
How to design a distributed system
How to design a distributed system
Jinglun Li
 
Comparison between Dynamo and riak
Comparison between Dynamo and riak
Beatriz Aguilar Gallo
 
SnapComms Technical Overview
SnapComms Technical Overview
leanne_abarro
 
005.itsecurity bcp v1
005.itsecurity bcp v1
Mohammad Ashfaqur Rahman
 
Redis. Seattle Data Science and Data Engineering Meetup
Redis. Seattle Data Science and Data Engineering Meetup
Abhishek Goswami
 
Version Control in TFS 2013: GIT - 2013 Application Lifecycle Management Event
Version Control in TFS 2013: GIT - 2013 Application Lifecycle Management Event
Delta-N
 
Highlights of Skills and Experience
Highlights of Skills and Experience
Dave Charlesworth
 
Highlights
Highlights
Dave Charlesworth
 
"Building intuitive command-line interfaces in .NET", Alex Thissen
"Building intuitive command-line interfaces in .NET", Alex Thissen
Fwdays
 
Linked in
Linked in
Dave Charlesworth
 
Dos and Don'ts of Android Application Security (Security Professional Perspec...
Dos and Don'ts of Android Application Security (Security Professional Perspec...
Bijay Senihang
 
Ride the database in JUnit tests with Database Rider
Ride the database in JUnit tests with Database Rider
Mikalai Alimenkou
 
VxClass for Incident Response
VxClass for Incident Response
zynamics GmbH
 
Three phase waveforms rcs
Three phase waveforms rcs
Colin Taylor
 
Machado de assis obras
Machado de assis obras
Flavio Maia Custodio
 
Machado De Assis
Machado De Assis
Belinha_Beel
 

More Related Content

What's hot (19)

Cqrs.frameworks
Cqrs.frameworks
Agata Piórkowska
 
Clean Architecture
Clean Architecture
Zahra Heydari
 
CLR Stored Procedures
CLR Stored Procedures
Harshana Weerasinghe
 
Bottlenecks in Java Applications
Bottlenecks in Java Applications
GlobalLogic Ukraine
 
Rundeck Office Hours: Best Practices for Access Control Policies
Rundeck Office Hours: Best Practices for Access Control Policies
TraciMyers6
 
Architecture Proposition For Multimedia repository
Architecture Proposition For Multimedia repository
McRaken
 
How to design a distributed system
How to design a distributed system
Jinglun Li
 
Comparison between Dynamo and riak
Comparison between Dynamo and riak
Beatriz Aguilar Gallo
 
SnapComms Technical Overview
SnapComms Technical Overview
leanne_abarro
 
005.itsecurity bcp v1
005.itsecurity bcp v1
Mohammad Ashfaqur Rahman
 
Redis. Seattle Data Science and Data Engineering Meetup
Redis. Seattle Data Science and Data Engineering Meetup
Abhishek Goswami
 
Version Control in TFS 2013: GIT - 2013 Application Lifecycle Management Event
Version Control in TFS 2013: GIT - 2013 Application Lifecycle Management Event
Delta-N
 
Highlights of Skills and Experience
Highlights of Skills and Experience
Dave Charlesworth
 
Highlights
Highlights
Dave Charlesworth
 
"Building intuitive command-line interfaces in .NET", Alex Thissen
"Building intuitive command-line interfaces in .NET", Alex Thissen
Fwdays
 
Linked in
Linked in
Dave Charlesworth
 
Dos and Don'ts of Android Application Security (Security Professional Perspec...
Dos and Don'ts of Android Application Security (Security Professional Perspec...
Bijay Senihang
 
Ride the database in JUnit tests with Database Rider
Ride the database in JUnit tests with Database Rider
Mikalai Alimenkou
 
VxClass for Incident Response
VxClass for Incident Response
zynamics GmbH
 
Bottlenecks in Java Applications
Bottlenecks in Java Applications
GlobalLogic Ukraine
 
Rundeck Office Hours: Best Practices for Access Control Policies
Rundeck Office Hours: Best Practices for Access Control Policies
TraciMyers6
 
Architecture Proposition For Multimedia repository
Architecture Proposition For Multimedia repository
McRaken
 
How to design a distributed system
How to design a distributed system
Jinglun Li
 
SnapComms Technical Overview
SnapComms Technical Overview
leanne_abarro
 
Redis. Seattle Data Science and Data Engineering Meetup
Redis. Seattle Data Science and Data Engineering Meetup
Abhishek Goswami
 
Version Control in TFS 2013: GIT - 2013 Application Lifecycle Management Event
Version Control in TFS 2013: GIT - 2013 Application Lifecycle Management Event
Delta-N
 
Highlights of Skills and Experience
Highlights of Skills and Experience
Dave Charlesworth
 
"Building intuitive command-line interfaces in .NET", Alex Thissen
"Building intuitive command-line interfaces in .NET", Alex Thissen
Fwdays
 
Dos and Don'ts of Android Application Security (Security Professional Perspec...
Dos and Don'ts of Android Application Security (Security Professional Perspec...
Bijay Senihang
 
Ride the database in JUnit tests with Database Rider
Ride the database in JUnit tests with Database Rider
Mikalai Alimenkou
 
VxClass for Incident Response
VxClass for Incident Response
zynamics GmbH
 

Viewers also liked (7)

Three phase waveforms rcs
Three phase waveforms rcs
Colin Taylor
 
Machado de assis obras
Machado de assis obras
Flavio Maia Custodio
 
Machado De Assis
Machado De Assis
Belinha_Beel
 
Eça de Queirós
Eça de Queirós
Endl Félix Muriel
 
Eça de Queirós
Eça de Queirós
anitanaescola
 
Machado de Assis
Machado de Assis
Robert Harris
 
Os Lusíadas - a estrutura
Os Lusíadas - a estrutura
Rosalina Simão Nunes
 
Ad

Similar to Oracle plsql code refactoring - from anonymous block to stored procedure (20)

Pillars of great Azure Architecture
Pillars of great Azure Architecture
Karthikeyan VK
 
Security of Oracle EBS - How I can Protect my System (UKOUG APPS 18 edition)
Security of Oracle EBS - How I can Protect my System (UKOUG APPS 18 edition)
Andrejs Prokopjevs
 
Profiling and Tuning a Web Application - The Dirty Details
Profiling and Tuning a Web Application - The Dirty Details
Achievers Tech
 
how to protect your sensitive data using oracle database vault
how to protect your sensitive data using oracle database vault
Anar Godjaev
 
resume_latest
resume_latest
Prasenjit Chowdhury
 
SQL in Version Control using SQL Server Database Projects
SQL in Version Control using SQL Server Database Projects
floydhilton
 
Tips_Tricks_for_Oracle_E-Business Suite_Database_Upgrade.pdf
Tips_Tricks_for_Oracle_E-Business Suite_Database_Upgrade.pdf
AkhashRamnath
 
ow.ppt
ow.ppt
ssuser96a63c
 
ow.ppt
ow.ppt
NalamalpuBhakthavats
 
kjdiakdnfdifjadsjkjklljlldasgjdjdljgfldjgldjgldjgl.ppt
kjdiakdnfdifjadsjkjklljlldasgjdjdljgfldjgldjgldjgl.ppt
Brahamam Veera
 
Ow
Ow
AlbertoItzincab1
 
Power of Azure Devops
Power of Azure Devops
Azure Riyadh User Group
 
Best practices for large oracle apps r12 implementations apps14
Best practices for large oracle apps r12 implementations apps14
Ajith Narayanan
 
Synopsis on online shopping by sudeep singh
Synopsis on online shopping by sudeep singh
Sudeep Singh
 
Maruthi_YH_resume
Maruthi_YH_resume
Maruthi YH
 
Hi I need security-related job points for the software develope.docx
Hi I need security-related job points for the software develope.docx
fideladallimore
 
Oracle Database Lifecycle Management
Oracle Database Lifecycle Management
Hari Srinivasan
 
Whats new in Enterprise 5.0 Product Suite
Whats new in Enterprise 5.0 Product Suite
Micro Focus
 
Application hardening
Application hardening
Jayesh Naik
 
Application hardening, Secure Socket Layer(SSL) & Secure Electronic Transacti...
Application hardening, Secure Socket Layer(SSL) & Secure Electronic Transacti...
Jayesh Naik
 
Pillars of great Azure Architecture
Pillars of great Azure Architecture
Karthikeyan VK
 
Security of Oracle EBS - How I can Protect my System (UKOUG APPS 18 edition)
Security of Oracle EBS - How I can Protect my System (UKOUG APPS 18 edition)
Andrejs Prokopjevs
 
Profiling and Tuning a Web Application - The Dirty Details
Profiling and Tuning a Web Application - The Dirty Details
Achievers Tech
 
how to protect your sensitive data using oracle database vault
how to protect your sensitive data using oracle database vault
Anar Godjaev
 
SQL in Version Control using SQL Server Database Projects
SQL in Version Control using SQL Server Database Projects
floydhilton
 
Tips_Tricks_for_Oracle_E-Business Suite_Database_Upgrade.pdf
Tips_Tricks_for_Oracle_E-Business Suite_Database_Upgrade.pdf
AkhashRamnath
 
kjdiakdnfdifjadsjkjklljlldasgjdjdljgfldjgldjgldjgl.ppt
kjdiakdnfdifjadsjkjklljlldasgjdjdljgfldjgldjgldjgl.ppt
Brahamam Veera
 
Best practices for large oracle apps r12 implementations apps14
Best practices for large oracle apps r12 implementations apps14
Ajith Narayanan
 
Synopsis on online shopping by sudeep singh
Synopsis on online shopping by sudeep singh
Sudeep Singh
 
Maruthi_YH_resume
Maruthi_YH_resume
Maruthi YH
 
Hi I need security-related job points for the software develope.docx
Hi I need security-related job points for the software develope.docx
fideladallimore
 
Oracle Database Lifecycle Management
Oracle Database Lifecycle Management
Hari Srinivasan
 
Whats new in Enterprise 5.0 Product Suite
Whats new in Enterprise 5.0 Product Suite
Micro Focus
 
Application hardening
Application hardening
Jayesh Naik
 
Application hardening, Secure Socket Layer(SSL) & Secure Electronic Transacti...
Application hardening, Secure Socket Layer(SSL) & Secure Electronic Transacti...
Jayesh Naik
 
Ad

Recently uploaded (20)

9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
Connecting Data and Intelligence: The Role of FME in Machine Learning
Connecting Data and Intelligence: The Role of FME in Machine Learning
Safe Software
 
From Manual to Auto Searching- FME in the Driver's Seat
From Manual to Auto Searching- FME in the Driver's Seat
Safe Software
 
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Nilesh Gule
 
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
 
Wenn alles versagt - IBM Tape schützt, was zählt! Und besonders mit dem neust...
Wenn alles versagt - IBM Tape schützt, was zählt! Und besonders mit dem neust...
Josef Weingand
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
Edge AI and Vision Alliance
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
Information Security Response Team Nepal_npCERT_Vice_President_Sudan_Jha.pdf
Information Security Response Team Nepal_npCERT_Vice_President_Sudan_Jha.pdf
ICT Frame Magazine Pvt. Ltd.
 
Techniques for Automatic Device Identification and Network Assignment.pdf
Techniques for Automatic Device Identification and Network Assignment.pdf
Priyanka Aash
 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
 
You are not excused! How to avoid security blind spots on the way to production
You are not excused! How to avoid security blind spots on the way to production
Michele Leroux Bustamante
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
biswajitbanerjee38
 
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
Priyanka Aash
 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
Connecting Data and Intelligence: The Role of FME in Machine Learning
Connecting Data and Intelligence: The Role of FME in Machine Learning
Safe Software
 
From Manual to Auto Searching- FME in the Driver's Seat
From Manual to Auto Searching- FME in the Driver's Seat
Safe Software
 
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Nilesh Gule
 
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Seminar: New Data: Passkey Adoption in the Workforce.pptx
FIDO Alliance
 
Wenn alles versagt - IBM Tape schützt, was zählt! Und besonders mit dem neust...
Wenn alles versagt - IBM Tape schützt, was zählt! Und besonders mit dem neust...
Josef Weingand
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
“Key Requirements to Successfully Implement Generative AI in Edge Devices—Opt...
Edge AI and Vision Alliance
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
Information Security Response Team Nepal_npCERT_Vice_President_Sudan_Jha.pdf
Information Security Response Team Nepal_npCERT_Vice_President_Sudan_Jha.pdf
ICT Frame Magazine Pvt. Ltd.
 
Techniques for Automatic Device Identification and Network Assignment.pdf
Techniques for Automatic Device Identification and Network Assignment.pdf
Priyanka Aash
 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
 
You are not excused! How to avoid security blind spots on the way to production
You are not excused! How to avoid security blind spots on the way to production
Michele Leroux Bustamante
 
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Seminar: Targeting Trust: The Future of Identity in the Workforce.pptx
FIDO Alliance
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
biswajitbanerjee38
 
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
A Constitutional Quagmire - Ethical Minefields of AI, Cyber, and Privacy.pdf
Priyanka Aash
 

Oracle plsql code refactoring - from anonymous block to stored procedure

  • 1. Carlos Oliveira / July 23, 2014
  • 2. Agenda  Code Refactoring – From anonymous block to procedure  Introduction  Quote  Code Refactoring  Benefits  Next Steps  Training & Reference  Thank You
  • 3. Introduction I am a forward-looking Information Systems Architect with a solid Oracle DBA background comprising the daily infrastructure tasks of the DBA, several projects as a Data Modeler, and performance management projects. I Started on the mainframe business, and soon had a deep dive in application development for Oracle databases. After acquiring an Oracle certification, I worked on performance enhancement for applications using Oracle databases, and later worked several years as an infrastructure DBA, later I worked on data modeling projects and more recently a performance management project, on both application and database layers.
  • 4. “The limits of my language mean the limits of my world.” Ludwig Wittgenstein
  • 5. Code Refactoring Script_text_file_01.sql – file contents below DECLARE /******************************************************** Description: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Changed: xx/xx/xxxx Changed By: xxxxxxx ********************************************************/ v_msg_text VARCHAR2(4000); v_msg_num NUMBER(10) := 0; BEGIN v_msg_text := 'Procedure executed'; v_msg_num := 1; END; / quit
  • 6. Code Refactoring CREATE OR REPLACE PROCEDURE DB_USER.PROC_NAME IS /******************************************************** Description: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Changed: xx/xx/xxxx Changed By: xxxxxxx ********************************************************/ v_msg_text VARCHAR2(4000); v_msg_num NUMBER(10) := 0; BEGIN v_msg_text := 'Procedure executed'; v_msg_num := 1; END; / Script_text_file_01.sql new BEGIN DB_USER.PROC_NAME; END; / quit Since the code is now stored in the database, the Script_text_file_01.sql only contains the call to the procedure.
  • 7. Benefits Compilation • Most of the code is already compiled – only caller script remains Memory • Reduced memory usage • Faster load Tracking • Code can be tracked inside DB • Explicit dependency – change in related objects are flagged Reuse • Code is ready to be reused • Change in central stored object is immediate for all calling scripts Security • Code can be included in database backup/restore • Access to code restricted by database privileges
  • 8. Next Steps Modularization • Identification of common code for grouping, organization or creation of internal or even external procedures • Encapsulation of complex code in procedures of functions Error Control • Inclusion of an Exception section for each code block • Use of user-created exceptions • Creation of common exception procedures Best Practices • Variable initialization • Eliminate hard-code And much more …
  • 9. Training • Performance Tuning Guide and Reference  http://docs.oracle.com/cd/B10500_01/server.920/a96533/toc.htm • SQL Reference  http://docs.oracle.com/cd/B10500_01/server.920/a96540/toc.htm • PL/SQL User's Guide and Reference  http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/toc.htm Resources at Oracle website
  • 10. Thank you Carlos Oliveira / July 23, 2014