<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kanishka L</title>
    <description>The latest articles on Forem by Kanishka L (@kani-l).</description>
    <link>https://forem.com/kani-l</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3457991%2Feebe4590-5698-47d4-888d-4951a971d3d3.png</url>
      <title>Forem: Kanishka L</title>
      <link>https://forem.com/kani-l</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kani-l"/>
    <language>en</language>
    <item>
      <title>AWS Service Blog: AWS Step Functions</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Thu, 18 Dec 2025 16:17:10 +0000</pubDate>
      <link>https://forem.com/kani-l/aws-service-blog-aws-step-functions-1j4h</link>
      <guid>https://forem.com/kani-l/aws-service-blog-aws-step-functions-1j4h</guid>
      <description>&lt;p&gt;Service Overview&lt;/p&gt;

&lt;p&gt;AWS Step Functions is a serverless workflow orchestration service that helps developers coordinate multiple AWS services into automated workflows. It allows you to design complex processes using visual state machines, making application logic easier to build, manage, and debug.&lt;/p&gt;

&lt;p&gt;Key Features&lt;/p&gt;

&lt;p&gt;Visual Workflow Designer – Create workflows using state diagrams&lt;/p&gt;

&lt;p&gt;Service Integration – Works with Lambda, ECS, EC2, DynamoDB, SNS, and more&lt;/p&gt;

&lt;p&gt;Error Handling &amp;amp; Retry Logic – Built-in failure management&lt;/p&gt;

&lt;p&gt;Serverless Architecture – No infrastructure to manage&lt;/p&gt;

&lt;p&gt;Long-Running Workflows – Supports workflows running for days or months&lt;/p&gt;

&lt;p&gt;Monitoring &amp;amp; Logging – Integrated with Amazon CloudWatch&lt;/p&gt;

&lt;p&gt;AWS Category / Cloud Domain&lt;/p&gt;

&lt;p&gt;Category: Application Integration&lt;/p&gt;

&lt;p&gt;Cloud Domain: Serverless &amp;amp; Workflow Orchestration&lt;/p&gt;

&lt;p&gt;Where It Fits in Cloud / DevOps Lifecycle&lt;/p&gt;

&lt;p&gt;AWS Step Functions fits mainly in the orchestration and automation stage of the Cloud/DevOps lifecycle:&lt;/p&gt;

&lt;p&gt;Automates CI/CD workflows&lt;/p&gt;

&lt;p&gt;Coordinates microservices communication&lt;/p&gt;

&lt;p&gt;Manages data processing pipelines&lt;/p&gt;

&lt;p&gt;Handles business process automation&lt;/p&gt;

&lt;p&gt;Improves reliability in production deployments&lt;/p&gt;

&lt;p&gt;Programming Language / Access Methods&lt;/p&gt;

&lt;p&gt;AWS Step Functions can be accessed using:&lt;/p&gt;

&lt;p&gt;AWS Management Console (Visual Editor)&lt;/p&gt;

&lt;p&gt;Amazon States Language (JSON-based)&lt;/p&gt;

&lt;p&gt;AWS SDKs with languages like:&lt;/p&gt;

&lt;p&gt;Python&lt;/p&gt;

&lt;p&gt;Java&lt;/p&gt;

&lt;p&gt;JavaScript&lt;/p&gt;

&lt;p&gt;C#&lt;/p&gt;

&lt;p&gt;Go&lt;/p&gt;

&lt;p&gt;AWS CLI and CloudFormation&lt;/p&gt;

&lt;p&gt;Pricing Model&lt;/p&gt;

&lt;p&gt;AWS Step Functions uses a pay-per-use pricing model:&lt;/p&gt;

&lt;p&gt;Charged based on state transitions&lt;/p&gt;

&lt;p&gt;Two workflow types:&lt;/p&gt;

&lt;p&gt;Standard Workflows – Pay per state transition&lt;/p&gt;

&lt;p&gt;Express Workflows – Pay based on execution time and number of executions&lt;/p&gt;

&lt;p&gt;Free Tier includes limited workflow executions per month&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Kibana – DevSecOps Tool Overview</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Thu, 18 Dec 2025 16:08:55 +0000</pubDate>
      <link>https://forem.com/kani-l/kibana-devsecops-tool-overview-hj8</link>
      <guid>https://forem.com/kani-l/kibana-devsecops-tool-overview-hj8</guid>
      <description>&lt;p&gt;1) Overview of the Tool&lt;/p&gt;

&lt;p&gt;Kibana is an intuitive web-based data visualization and analytics interface that works on top of Elasticsearch data. It lets users search, explore, visualize, and build dashboards from large datasets in real time. While part of the Elastic Stack (formerly ELK Stack), Kibana itself focuses on turning raw log and metric data stored in Elasticsearch into interactive charts, graphs, and dashboards. &lt;br&gt;
Elastic&lt;/p&gt;

&lt;p&gt;2) Key Features of Kibana&lt;/p&gt;

&lt;p&gt;Kibana provides a rich set of features that make data interpretation and monitoring easier:&lt;/p&gt;

&lt;p&gt;✔ Data Visualization &amp;amp; Dashboards — Create interactive line charts, bar graphs, pie charts, heatmaps, timelion graphs, and maps that update in real time. &lt;br&gt;
Siberoloji&lt;br&gt;
+1&lt;/p&gt;

&lt;p&gt;✔ Discover &amp;amp; Search — Explore, filter, and query Elasticsearch data with powerful search features. &lt;br&gt;
Elastic&lt;/p&gt;

&lt;p&gt;✔ Advanced Dashboards — Combine multiple visualizations into customizable dashboards for system or business insights. &lt;br&gt;
Siberoloji&lt;/p&gt;

&lt;p&gt;✔ Security &amp;amp; Access Control — Role-based access control (RBAC) and secure spaces allow restricted access to specific dashboards and data. &lt;br&gt;
DEV Community&lt;/p&gt;

&lt;p&gt;✔ Reporting &amp;amp; Share — Export dashboards to PDF/CSV, exportable and shareable links. &lt;br&gt;
DEV Community&lt;/p&gt;

&lt;p&gt;✔ Canvas — A tool to build custom, pixel-perfect presentations using live Elasticsearch data. &lt;br&gt;
DEV Community&lt;/p&gt;

&lt;p&gt;✔ Plugins &amp;amp; Extensibility — Extend capabilities using plugins like Vega, Prometheus exporter, etc. &lt;br&gt;
Elastic&lt;/p&gt;

&lt;p&gt;3) How Kibana Fits into DevOps / DevSecOps&lt;/p&gt;

&lt;p&gt;In DevOps:&lt;/p&gt;

&lt;p&gt;Helps monitor application performance and infrastructure health by visualizing logs and metrics.&lt;/p&gt;

&lt;p&gt;Supports troubleshooting and root-cause analysis through dashboards that show deployment, error, and usage data in real time. &lt;br&gt;
DEV Community&lt;/p&gt;

&lt;p&gt;In DevSecOps:&lt;/p&gt;

&lt;p&gt;Enables teams to visualize security logs and threat data to detect anomalies and unusual patterns.&lt;/p&gt;

&lt;p&gt;Used for incident investigation, alerting, and compliance reporting, improving threat monitoring and proactive response. &lt;br&gt;
h2kinfosys.com&lt;br&gt;
+1&lt;/p&gt;

&lt;p&gt;Kibana effectively bridges operational performance and security analysis, making it a key observability component in modern DevOps/DevSecOps workflows.&lt;/p&gt;

&lt;p&gt;4) Programming Language&lt;/p&gt;

&lt;p&gt;Kibana is primarily developed using JavaScript and TypeScript, with front-end UI components built on React and a backend that interacts with Elasticsearch’s REST APIs. &lt;br&gt;
DEV Community&lt;br&gt;
+1&lt;/p&gt;

&lt;p&gt;5) Parent Company&lt;/p&gt;

&lt;p&gt;The tool is developed and maintained by Elastic, the company behind the Elastic Stack, which includes Elasticsearch, Logstash, Beats, and Kibana. &lt;br&gt;
DEV Community&lt;br&gt;
+1&lt;/p&gt;

&lt;p&gt;6) Open Source or Paid?&lt;/p&gt;

&lt;p&gt;Hybrid licensing model:&lt;/p&gt;

&lt;p&gt;The core Kibana product is open-source/available under source-available licenses with community features. &lt;br&gt;
Wikipedia&lt;/p&gt;

&lt;p&gt;Commercial/paid features (advanced security, machine learning, enterprise alerting, etc.) are available via Elastic’s paid subscription tiers. &lt;br&gt;
DEV Community&lt;/p&gt;

&lt;p&gt;So you can use the basic version for free, but enterprises often choose paid subscriptions for full security and analytics capabilities.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Latest news in DBMS</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Tue, 07 Oct 2025 07:30:40 +0000</pubDate>
      <link>https://forem.com/kani-l/latest-news-in-dbms-2e04</link>
      <guid>https://forem.com/kani-l/latest-news-in-dbms-2e04</guid>
      <description>&lt;p&gt;The global poster and printing market continues to expend with remarkable innovation and demand across costum digital and traditional formates&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foh6sl176vazkr0pe5dp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foh6sl176vazkr0pe5dp2.png" alt=" " width="800" height="1160"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Latest news in DBMS in 2025</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Tue, 07 Oct 2025 07:26:37 +0000</pubDate>
      <link>https://forem.com/kani-l/latest-news-in-dbms-in-2025-2bmd</link>
      <guid>https://forem.com/kani-l/latest-news-in-dbms-in-2025-2bmd</guid>
      <description>&lt;p&gt;The global poster and printing market continues to expand with remarkable innovation and demand across custom, digital, and traditional formats. 📈&lt;/p&gt;

&lt;h1&gt;
  
  
  MarketGrowth #PrintingIndustry #DigitalTransformation #PosterDesign #Innovation #VisualMarketing #BusinessTrends2025
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt3hnuj7da16vp89x238.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt3hnuj7da16vp89x238.png" alt=" " width="800" height="1160"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MangoDB</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Tue, 07 Oct 2025 07:21:27 +0000</pubDate>
      <link>https://forem.com/kani-l/mangodb-2626</link>
      <guid>https://forem.com/kani-l/mangodb-2626</guid>
      <description>&lt;p&gt;I decided to use MongoDB for building my blog. As I have never worked with MongoDB before, I still have to figure out how to get everything to work. So, the only thing left to do now is getting started with MongoDB. How do we set it up, add users, and create our database.&lt;/p&gt;

&lt;p&gt;First, lets download the community server which is free and open source. I will be using the Windows version for my desktop and this article. After installing the software, I also installed mongosh since I am an avid command line user. After adding mongosh to my PATH variablesIt is halfway when trying to boot the server again, that I figured that using mongosh might not have been the brightest of ideas. MongoDB is already new to me and using beta software that does not support all commands yet is not making things any easier. So, I switched to the legacy mongo shell, since the documentation is up to date for that. I managed to boot the server again and logging into my database!Creating a Database&lt;br&gt;
I got my authentication ready, the final step now is to create a database. You can easily create a new database in MongoDB with the use  command. If the database doesn't exist yet, it creates it. Keep in mind though that MongoDB will save the database only when you put data in it. Until then, it is not saved and does not show up when using the show dbs command.&lt;/p&gt;

&lt;p&gt;With MongoDB running on my desktop, I can finally start with a little proof of concept. I will use that proof of concept to figure out how to connect to MongoDB and add my first set of data using Spring Boot. That should allow me to get a better grip on the technologies to start implementing it for the actual project. You know... less hacky and a bit more clean. However, that is for another post!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum7d7fuaz80k5ir891g9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fum7d7fuaz80k5ir891g9.jpg" alt=" " width="800" height="296"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7twv2dx6vxx1gp5rs233.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7twv2dx6vxx1gp5rs233.jpg" alt=" " width="800" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea9jwggbqwznw0xwojad.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea9jwggbqwznw0xwojad.jpg" alt=" " width="800" height="332"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtkl2if0mehwvcgprunm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtkl2if0mehwvcgprunm.jpg" alt=" " width="800" height="372"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jhiy6t1jiecduh53l84.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jhiy6t1jiecduh53l84.jpg" alt=" " width="800" height="526"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06w4rxumaw80kuikpkhe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F06w4rxumaw80kuikpkhe.jpg" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F937p4mu0fghvo0kmgefo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F937p4mu0fghvo0kmgefo.jpg" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq80okodns7sxcl71h7wq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq80okodns7sxcl71h7wq.jpg" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy600xes85d8pzgdjykvn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy600xes85d8pzgdjykvn.jpg" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bi4j769kqb5cy689h8r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bi4j769kqb5cy689h8r.jpg" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0se85ihh36gt0vy8shwl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0se85ihh36gt0vy8shwl.jpg" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuzo8wh9h3vsuib69bz4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuzo8wh9h3vsuib69bz4.jpg" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7v5klo9ltopuuskys904.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7v5klo9ltopuuskys904.jpg" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Transactions, Deadlocks &amp; Log-Based Recovery</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Tue, 07 Oct 2025 07:11:08 +0000</pubDate>
      <link>https://forem.com/kani-l/transactions-deadlocks-log-based-recovery-1j4d</link>
      <guid>https://forem.com/kani-l/transactions-deadlocks-log-based-recovery-1j4d</guid>
      <description>&lt;p&gt;**Databases are powerful because they ensure data integrity even when multiple users access the system at the same time. This is managed through transactions, deadlock detection, and log-based recovery.&lt;/p&gt;

&lt;p&gt;In this blog, I demonstrate these concepts using a single Accounts table in Oracle Live SQL.**&lt;/p&gt;

&lt;p&gt;📌 Schema Setup&lt;br&gt;
We first create a table to simulate account balances:&lt;br&gt;
CREATE TABLE Accounts (&lt;br&gt;
acc_no INT PRIMARY KEY,&lt;br&gt;
name VARCHAR2(50),&lt;br&gt;
balance INT&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts VALUES (1, 'Alice', 1000);&lt;br&gt;
INSERT INTO Accounts VALUES (2, 'Bob', 1500);&lt;br&gt;
INSERT INTO Accounts VALUES (3, 'Charlie', 2000);&lt;/p&gt;

&lt;p&gt;COMMIT;&lt;/p&gt;

&lt;p&gt;1️⃣ Transaction – Atomicity &amp;amp; Rollback&lt;br&gt;
Goal: Transfer ₹500 from Alice to Bob. Rollback before commit to ensure no partial update.&lt;br&gt;
-- Start transaction&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance - 500&lt;br&gt;
WHERE name = 'Alice';&lt;/p&gt;

&lt;p&gt;UPDATE Accounts&lt;br&gt;
SET balance = balance + 500&lt;br&gt;
WHERE name = 'Bob';&lt;/p&gt;

&lt;p&gt;-- Rollback the transaction&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;-- Check balances (should be unchanged)&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;✅ Balances remain:&lt;/p&gt;

&lt;p&gt;Alice → 1000&lt;br&gt;
Bob → 1500&lt;/p&gt;

&lt;p&gt;Lesson: Atomicity ensures that either all operations in a transaction succeed, or none do.&lt;/p&gt;

&lt;p&gt;2️⃣ Deadlock Simulation&lt;br&gt;
Goal: Simulate a deadlock between two sessions.&lt;br&gt;
Session 1: Lock Alice’s account and try to update Bob’s.&lt;br&gt;
Session 2: Lock Bob’s account and try to update Alice’s.&lt;/p&gt;

&lt;p&gt;🔥 Oracle detects circular wait → deadlock → one session is rolled back automatically.&lt;br&gt;
Lesson: Deadlocks can occur when two transactions wait on each other’s locks. DBMS automatically resolves them.&lt;/p&gt;

&lt;p&gt;3️⃣ Log-Based Recovery&lt;br&gt;
Goal: Show that updates are tracked for recovery using logs.&lt;br&gt;
-- Start transaction&lt;br&gt;
UPDATE Accounts SET balance = balance + 1000 WHERE name = 'Alice';&lt;/p&gt;

&lt;p&gt;-- Rollback&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;-- Verify&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;✅ Even after rollback, balances are restored, demonstrating undo capability via internal logs.&lt;br&gt;
Note: In Oracle Live SQL, redo/undo logs are internal. The rollback proves that log-based recovery works.&lt;/p&gt;

&lt;p&gt;🎯 Summary&lt;br&gt;
Through these demos, I explored:&lt;br&gt;
✅ Atomicity &amp;amp; Rollback – all-or-nothing transactions&lt;br&gt;
✅ Deadlocks – isolation and conflict resolution&lt;br&gt;
✅ Log-Based Recovery – durability and undo operations&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; Sir for guiding us to try these experiments hands-on in Oracle Live SQL.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzi98htwlom09d6atmvtq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzi98htwlom09d6atmvtq.jpg" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhr7r2f2obmecgip33uj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhr7r2f2obmecgip33uj.jpg" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn996w79ypv4c68b3eqbv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn996w79ypv4c68b3eqbv.jpg" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo74fho9cm6shm5rd71qw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo74fho9cm6shm5rd71qw.jpg" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2l3h70n8cujstwoybw9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2l3h70n8cujstwoybw9.jpg" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>tutorial</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>Database Hashing</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Tue, 07 Oct 2025 07:06:37 +0000</pubDate>
      <link>https://forem.com/kani-l/database-hashing-1o8m</link>
      <guid>https://forem.com/kani-l/database-hashing-1o8m</guid>
      <description>&lt;p&gt;I started my writing journey on Hashing but I've been wanting to expand my audience by widely publishing articles across the interwebs. I discovered dev.to as another great platform to share developer-related content.Dev.to has dedicated support for posting to the community from RSS. Additionally, dev.to supports canonical linking to protect SEO rankings. Luckily, Hashnode provides an RSS feed so republishing content from Hashnode onto dev.to is easy and fast.&lt;/p&gt;

&lt;p&gt;You can find your Hashnode RSS example, my. You can also find it linked on your blog page. See the arrow in the screenshot below for the location.After creating a dev.to account, open the settings and head to the Extensions tab. Under the Extensions tab, you will find Publishing to DEV Community from RSS. Simply copy your Hashnode RSS feed into the RSS Feed URL field and hit Save Feed Settings. After a few seconds, your Hashing articles will appear as drafts in the dev.to dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsdke910rqatbcd3hjhl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsdke910rqatbcd3hjhl.jpg" alt=" " width="800" height="340"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsmbmvhxeqjdzc4dqhzz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsmbmvhxeqjdzc4dqhzz.jpg" alt=" " width="800" height="325"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqynj993m71ftc56ctp0z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqynj993m71ftc56ctp0z.jpg" alt=" " width="800" height="329"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxosd975d66kgtry4u28.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxosd975d66kgtry4u28.jpg" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu59kugctcewgkwz0z2qw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu59kugctcewgkwz0z2qw.jpg" alt=" " width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Understanding ACID Properties in SQL with Examples</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Tue, 07 Oct 2025 06:56:20 +0000</pubDate>
      <link>https://forem.com/kani-l/understanding-acid-properties-in-sql-with-examples-1302</link>
      <guid>https://forem.com/kani-l/understanding-acid-properties-in-sql-with-examples-1302</guid>
      <description>&lt;p&gt;ACID properties — Atomicity, Consistency, Isolation, Durability — ensure that database transactions are reliable, safe, and predictable. Let’s explore them with a practical Accounts table.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Sample Accounts Table
CREATE TABLE Accounts (
acc_no INT PRIMARY KEY,
name VARCHAR2(50),
balance INT CHECK (balance &amp;gt;= 0) -- enforce positive balance
);&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Insert sample data&lt;br&gt;
INSERT INTO Accounts VALUES (101, 'Alice', 5000);&lt;br&gt;
INSERT INTO Accounts VALUES (102, 'Bob', 3000);&lt;br&gt;
INSERT INTO Accounts VALUES (103, 'Charlie', 7000);&lt;/p&gt;

&lt;p&gt;COMMIT;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Atomicity&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Definition: Either all operations in a transaction succeed, or none do.&lt;/p&gt;

&lt;p&gt;Scenario: Transfer 1000 from Alice to Bob, but simulate a failure midway.&lt;/p&gt;

&lt;p&gt;-- Start transaction&lt;br&gt;
BEGIN&lt;br&gt;
-- Deduct 1000 from Alice&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance - 1000&lt;br&gt;
WHERE acc_no = 101;&lt;/p&gt;

&lt;p&gt;-- Simulate error (e.g., divide by zero)&lt;br&gt;
-- This will cause the transaction to fail&lt;br&gt;
-- Uncomment the following line to simulate failure&lt;br&gt;
-- DECLARE x NUMBER := 1/0; END;&lt;/p&gt;

&lt;p&gt;-- Add 1000 to Bob&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance + 1000&lt;br&gt;
WHERE acc_no = 102;&lt;/p&gt;

&lt;p&gt;COMMIT; -- Will not reach here if error occurs&lt;br&gt;
EXCEPTION&lt;br&gt;
WHEN OTHERS THEN&lt;br&gt;
ROLLBACK; -- Ensures no partial update&lt;br&gt;
DBMS_OUTPUT.PUT_LINE('Transaction failed, rolled back.');&lt;br&gt;
END;&lt;br&gt;
/&lt;br&gt;
✅ After rollback, balances remain unchanged — Atomicity is maintained.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Consistency&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Definition: Transactions must leave the database in a valid state.&lt;/p&gt;

&lt;p&gt;Scenario: Try inserting a negative balance.&lt;/p&gt;

&lt;p&gt;-- This will fail due to the CHECK constraint&lt;br&gt;
INSERT INTO Accounts VALUES (104, 'David', -500);&lt;/p&gt;

&lt;p&gt;The database rejects this, ensuring Consistency.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Isolation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Definition: Concurrent transactions should not interfere with each other.&lt;/p&gt;

&lt;p&gt;Scenario: Two sessions:&lt;/p&gt;

&lt;p&gt;Session 1: Update Alice’s balance&lt;/p&gt;

&lt;p&gt;UPDATE Accounts&lt;br&gt;
SET balance = balance + 2000&lt;br&gt;
WHERE acc_no = 101;&lt;br&gt;
-- Do not commit yet&lt;/p&gt;

&lt;p&gt;Session 2: Read Alice’s balance&lt;/p&gt;

&lt;p&gt;SELECT balance FROM Accounts WHERE acc_no = 101;&lt;/p&gt;

&lt;p&gt;Session 2 will not see the uncommitted change (depending on isolation level, default is READ COMMITTED).&lt;/p&gt;

&lt;p&gt;This prevents dirty reads — demonstrating Isolation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Durability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Definition: Once a transaction is committed, data persists even after a crash.&lt;/p&gt;

&lt;p&gt;-- Commit a transaction&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance + 1000&lt;br&gt;
WHERE acc_no = 102;&lt;/p&gt;

&lt;p&gt;COMMIT;&lt;/p&gt;

&lt;p&gt;Restart the database.&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;Changes persist — Durability is guaranteed.&lt;/p&gt;

&lt;p&gt;Summary Table&lt;br&gt;
ACID Property Example Action&lt;br&gt;
Atomicity Transfer money → rollback on error&lt;br&gt;
Consistency CHECK constraint prevents negative balance&lt;br&gt;
Isolation Concurrent reads/writes don’t interfere&lt;br&gt;
Durability Committed changes persist after DB restart&lt;/p&gt;

&lt;p&gt;💡Tip: Try changing isolation levels (READ COMMITTED, SERIALIZABLE) to observe how concurrent transactions behave differently&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5viikd0g3qg2ht3ectr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5viikd0g3qg2ht3ectr.jpg" alt=" " width="800" height="366"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj565ra5bde9arxubhjzp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj565ra5bde9arxubhjzp.jpg" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfhz8vvnksd7p6qx09ww.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfhz8vvnksd7p6qx09ww.jpg" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fug12i6ifnlmveg72gdat.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fug12i6ifnlmveg72gdat.jpg" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisv8vhiejrtvpewbai1e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisv8vhiejrtvpewbai1e.jpg" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cursor and Trigger</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Tue, 07 Oct 2025 06:33:07 +0000</pubDate>
      <link>https://forem.com/kani-l/cursor-and-trigger-44df</link>
      <guid>https://forem.com/kani-l/cursor-and-trigger-44df</guid>
      <description>&lt;p&gt;A cursor in a Database Management System (DBMS) is a special control structure used to traverse and manipulate the rows in a result set one at a time. While standard SQL operations are typically set-based and act on all rows simultaneously, a cursor enables row-by-row processing, making it ideal for scenarios that require sequential logic, conditional operations, or custom computations on each individual row. Cursors are especially useful in complex business workflows where fine-grained control over data handling is necessary.&lt;/p&gt;

&lt;p&gt;Step 1: Create Employee Table&lt;br&gt;
CREATE TABLE Employee ( Emp_ID NUMBER PRIMARY KEY, Emp_Name VARCHAR2(50), Salary NUMBER );&lt;/p&gt;

&lt;p&gt;Step 2: Insert Sample Data&lt;br&gt;
INSERT INTO Employee (Emp_ID, Emp_Name, Salary) VALUES (1, 'Ramesh', 60000); INSERT INTO Employee (Emp_ID, Emp_Name, Salary) VALUES (2, 'Suresh', 45000); INSERT INTO Employee (Emp_ID, Emp_Name, Salary) VALUES (3, 'Anita', 75000); INSERT INTO Employee (Emp_ID, Emp_Name, Salary) VALUES (4, 'Kavya', 50000);&lt;/p&gt;

&lt;p&gt;Step 3: Create and Process Cursor&lt;br&gt;
OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_EmpName, v_Salary; EXIT WHEN emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee: ' || v_EmpName || ', Salary: ₹' || v_Salary); END LOOP; CLOSE emp_cursor; END;&lt;/p&gt;

&lt;p&gt;DBMS_OUTPUT.PUT_LINE prints each employee’s name and salary.&lt;/p&gt;

&lt;p&gt;DEFINITION OF TRIGGER IN DBMS&lt;/p&gt;

&lt;p&gt;A trigger in DBMS is a special stored procedure that automatically executes in response to events like INSERT, UPDATE, or DELETE on a table or view. It’s commonly used to enforce business rules, maintain data integrity, and log changes without manual intervention.&lt;/p&gt;

&lt;p&gt;Step 1: Create Students Table&lt;br&gt;
CREATE TABLE Students ( Student_ID NUMBER PRIMARY KEY, Student_Name VARCHAR2(50), Course VARCHAR2(50) );&lt;/p&gt;

&lt;p&gt;Step 2: Create Student_Audit Table&lt;br&gt;
CREATE TABLE Student_Audit ( Audit_ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, Student_ID NUMBER, Student_Name VARCHAR2(50), Action VARCHAR2(50), Action_Time TIMESTAMP );&lt;/p&gt;

&lt;p&gt;Step 3: Create AFTER INSERT Trigger&lt;br&gt;
CREATE OR REPLACE TRIGGER trg_after_student_insert AFTER INSERT ON Students FOR EACH ROW BEGIN INSERT INTO Student_Audit (Student_ID, Student_Name, Action, Action_Time) VALUES (:NEW.Student_ID, :NEW.Student_Name, 'INSERT', SYSTIMESTAMP); END;&lt;/p&gt;

&lt;p&gt;Step 4: Test Trigger&lt;br&gt;
INSERT INTO Students (Student_ID, Student_Name, Course) VALUES (1, 'Ravi', 'Computer Science'); INSERT INTO Students (Student_ID, Student_Name, Course) VALUES (2, 'Meena', 'Electrical Engineering');&lt;/p&gt;

&lt;p&gt;Step 5: Verify Audit Table&lt;br&gt;
SELECT * FROM Student_Audit;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpz8rjl978t15k32x1ak5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpz8rjl978t15k32x1ak5.jpg" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcin7ntiscryuyu1y7gvc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcin7ntiscryuyu1y7gvc.jpg" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4updlv8991hdgu6n6zb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4updlv8991hdgu6n6zb.jpg" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdy2ovnet4j8hlo0iq4gs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdy2ovnet4j8hlo0iq4gs.jpg" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkh903ik3l3kefl14wx8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkh903ik3l3kefl14wx8.jpg" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F016bhg8j6lepn6tgrl8f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F016bhg8j6lepn6tgrl8f.jpg" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Database Normalization</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Tue, 07 Oct 2025 06:23:33 +0000</pubDate>
      <link>https://forem.com/kani-l/database-normalization-1mif</link>
      <guid>https://forem.com/kani-l/database-normalization-1mif</guid>
      <description>&lt;p&gt;Database normalization is the process of structuring a relational database to reduce redundancy and improve data integrity.&lt;/p&gt;

&lt;p&gt;In this blog, we'll normalize a student-course-instructor dataset from Unnormalized Form 1NF ← 2NF ←&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhaqzxhc37k5o8vnjgpxu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhaqzxhc37k5o8vnjgpxu.jpg" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feakvjtjhh3wghzt4qxg8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feakvjtjhh3wghzt4qxg8.jpg" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3NF, and implement it in SQL.&lt;/p&gt;

&lt;p&gt;Step 1: Base Table&lt;/p&gt;

&lt;p&gt;The initial unnormalized table includes details of students, their courses, instructors, and corresponding grades.Step 2: Identifying Anomalies&lt;/p&gt;

&lt;p&gt;Insertion anomaly: A new course cannot&lt;/p&gt;

&lt;p&gt;be added unless it is linked to a student.&lt;/p&gt;

&lt;p&gt;Update anomaly: Modifying a course&lt;/p&gt;

&lt;p&gt;name requires updating it in several rows.&lt;/p&gt;

&lt;p&gt;Deletion anomaly: Removing a student&lt;/p&gt;

&lt;p&gt;may also remove valuable course details if that student was the only enrollee.&lt;/p&gt;

&lt;p&gt;1 First Normal Form (1NF)&lt;/p&gt;

&lt;p&gt;Rule: Eliminate repeating groups, ensure atomic values.&lt;/p&gt;

&lt;p&gt;So, we split multi-valued attributes into separate rows:Step 2: Identifying Anomalies&lt;/p&gt;

&lt;p&gt;Insertion anomaly: A new course cannot&lt;/p&gt;

&lt;p&gt;be added unless it is linked to a student.&lt;/p&gt;

&lt;p&gt;Update anomaly: Modifying a course&lt;/p&gt;

&lt;p&gt;name requires updating it in several rows.&lt;/p&gt;

&lt;p&gt;Deletion anomaly: Removing a student&lt;/p&gt;

&lt;p&gt;may also remove valuable course details if that student was the only enrollee.1 First Normal Form (1NF)&lt;/p&gt;

&lt;p&gt;Rule: Eliminate repeating groups, ensure atomic values.&lt;/p&gt;

&lt;p&gt;So, we split multi-valued attributes into separate rows:SQL Table in 1 NF,&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students_1NF (&lt;/p&gt;

&lt;p&gt;Student_ID INT,&lt;/p&gt;

&lt;p&gt;Student_Name VARCHAR2(100),&lt;/p&gt;

&lt;p&gt;Course_ID INT,&lt;/p&gt;

&lt;p&gt;Course_Name VARCHAR2(100),&lt;/p&gt;

&lt;p&gt;Instructor VARCHAR2(100),&lt;/p&gt;

&lt;p&gt;Grade CHAR(2),&lt;/p&gt;

&lt;p&gt;PRIMARY KEY (Student_ID, Course_ID) );2 Second Normal Form (2NF)&lt;/p&gt;

&lt;p&gt;Rule: Remove partial dependency → non-key attributes should depend on thewhole primary key.&lt;/p&gt;

&lt;p&gt;Here, student_id depends on student info, course_id depends on course info, and instructor depends on the course.&lt;/p&gt;

&lt;p&gt;So, we split into three tables:&lt;/p&gt;

&lt;p&gt;SQL Create Tables (2NF):&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students ( StudentID VARCHAR2(10) PRIMARY KEY, StudentName VARCHAR2(100) );&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses ( CourseID VARCHAR2(10) PRIMARY KEY, CourseName VARCHAR2(100), Instructor VARCHAR2(100), InstructorPhone VARCHAR2(15) );&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments ( StudentID VARCHAR2(10), CourseID VARCHAR2(10),PRIMARY KEY (StudentID, CourseID), FOREIGN KEY (StudentID) REFERENCES Student(StudentID), FOREIGN KEY (CourseID) REFERENCES Course (CourseID) );3 Third Normal Form (3NF)&lt;/p&gt;

&lt;p&gt;Rule: Remove transitive dependenciesnon-key attributes depending on other non-key attributes).&lt;/p&gt;

&lt;p&gt;Here, instructor_phone depends on instructor, not on course_id. So we separate Instructor data:&lt;/p&gt;

&lt;p&gt;SQL Create Tables (3NF):&lt;/p&gt;

&lt;p&gt;REATE TABLE Instructors ( InstructorID VARCHAR2(10) PRIMARY KEY, InstructorName VARCHAR2(100), InstructorPhone VARCHAR2(15)&lt;/p&gt;

&lt;p&gt;);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses3NF ( CourseID VARCHAR2(10) PRIMARY KEY, CourseName VARCHAR2(100), InstructorID VARCHAR2(10), FOREIGN KEY (InstructorID) REFERENCES Instructor(InstructorID) );CREATE TABLE Students3NF ( StudentID VARCHAR2(10) PRIMARY KEY, StudentName VARCHAR2(100) );&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments3NF ( StudentID VARCHAR2(10), CourseID VARCHAR2(10), PRIMARY KEY (StudentID, CourseID), FOREIGN KEY (StudentID) REFERENCES Student3NF(StudentID), FOREIGN KEY (CourseID) REFERENCES Course3NF(CourseID) );Step 6: Insert Sample Data&lt;/p&gt;

&lt;p&gt;Instructors&lt;/p&gt;

&lt;p&gt;INSERT INTO Instructor VALUES ('101', 'Dr.&lt;/p&gt;

&lt;p&gt;Kumar', '9876543210');&lt;/p&gt;

&lt;p&gt;INSERT INTO Instructor VALUES ('102', 'Dr.&lt;/p&gt;

&lt;p&gt;Mehta', '9123456780');&lt;/p&gt;

&lt;p&gt;INSERT INTO Instructor VALUES ('103', 'Dr.&lt;/p&gt;

&lt;p&gt;Rao', '9988776655');&lt;/p&gt;

&lt;p&gt;Courses&lt;/p&gt;

&lt;p&gt;INSERT INTO Course3NF VALUES ('C101', 'DBMS', '101');&lt;/p&gt;

&lt;p&gt;INSERT INTO Course3NF VALUES ('C102',&lt;/p&gt;

&lt;p&gt;'Data Mining', '102');&lt;/p&gt;

&lt;p&gt;INSERT INTO Course3NF VALUES ('C103', 'ΑΙ', '103');&lt;/p&gt;

&lt;p&gt;Students&lt;/p&gt;

&lt;p&gt;INSERT INTO Student3NF VALUES ('S01', 'Arjun');&lt;/p&gt;

&lt;p&gt;INSERT INTO Student3NF VALUES ('S02',&lt;/p&gt;

&lt;p&gt;'Priva'):Enrollment&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollment3NF VALUES ('S01', 'C101');&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollment3NF VALUES ('S01', 'C102');&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollment3NF VALUES ('S02', 'C101');&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollment3NF VALUES ('S03', 'C103');Step 7: Query with JOINS&lt;/p&gt;

&lt;p&gt;SELECT s.StudentName, c.CourseName, i.InstructorName&lt;/p&gt;

&lt;p&gt;FROM Enrollment3NF e&lt;/p&gt;

&lt;p&gt;JOIN Student3NF s ON e. StudentID =s.StudentID&lt;/p&gt;

&lt;p&gt;JOIN Course3NF c ON e. CourseID = c.CourselD&lt;/p&gt;

&lt;p&gt;JOIN Instructor i ON c.InstructorID = i.InstructorID;** Wrap Up**&lt;/p&gt;

&lt;p&gt;We started with an unnormalized table and step-by-step applied:&lt;/p&gt;

&lt;p&gt;1NF ← Removed repeating groups&lt;/p&gt;

&lt;p&gt;2NF ← Removed partial dependencies&lt;/p&gt;

&lt;p&gt;3NF ← Removed transitive dependencies&lt;/p&gt;

&lt;p&gt;Result&lt;/p&gt;

&lt;p&gt;A clean, normalized database3NF&lt;/p&gt;

&lt;p&gt;← Removed transitive dependencies&lt;/p&gt;

&lt;p&gt;← Result A clean, normalized database with reduced redundancy, better integrity, and easier queries&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; for mentoring me on database normalization concepts!&lt;/p&gt;

&lt;p&gt;SQL #Oracle&lt;/p&gt;

&lt;h1&gt;
  
  
  DBMS
&lt;/h1&gt;

&lt;h1&gt;
  
  
  DatabaseNormalization
&lt;/h1&gt;

&lt;h1&gt;
  
  
  1NF
&lt;/h1&gt;

&lt;h1&gt;
  
  
  2NF
&lt;/h1&gt;

&lt;h1&gt;
  
  
  3NF
&lt;/h1&gt;

&lt;h1&gt;
  
  
  BCNF
&lt;/h1&gt;

&lt;h1&gt;
  
  
  4NF
&lt;/h1&gt;

&lt;h1&gt;
  
  
  5NF
&lt;/h1&gt;

&lt;h1&gt;
  
  
  DataModeling
&lt;/h1&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>College Student &amp; Course Management System (Oracle LiveSQL) sql #oracle #database #tutorial</title>
      <dc:creator>Kanishka L</dc:creator>
      <pubDate>Mon, 25 Aug 2025 12:21:47 +0000</pubDate>
      <link>https://forem.com/kani-l/college-student-course-management-system-oracle-livesqlsql-oracle-database-tutorial-5ei9</link>
      <guid>https://forem.com/kani-l/college-student-course-management-system-oracle-livesqlsql-oracle-database-tutorial-5ei9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this blog, I’ll walk you through my hands-on implementation of a College Student &amp;amp; Course Management System using Oracle LiveSQL.&lt;br&gt;
This project helped me practice real-world SQL concepts such as table creation, data insertion, constraints, queries, and views.&lt;/p&gt;

&lt;p&gt;What’s Covered?&lt;/p&gt;

&lt;p&gt;✅ Table creation&lt;br&gt;
✅ Data insertion&lt;br&gt;
✅ Constraints &amp;amp; table alterations&lt;br&gt;
✅ SQL queries with string functions &amp;amp; aggregates&lt;br&gt;
✅ Joins&lt;br&gt;
✅ Views&lt;br&gt;
✅ Grouping with HAVING&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Table Creation
&lt;/h2&gt;

&lt;p&gt;I started by creating the core tables – Students, Faculty, and Courses.&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
    StudentID NUMBER PRIMARY KEY,&lt;br&gt;
    Name VARCHAR2(50) NOT NULL,&lt;br&gt;
    Dept VARCHAR2(30),&lt;br&gt;
    DOB DATE,&lt;br&gt;
    Email VARCHAR2(50) UNIQUE&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Faculty (&lt;br&gt;
    FacultyID NUMBER PRIMARY KEY,&lt;br&gt;
    FacultyName VARCHAR2(50) NOT NULL,&lt;br&gt;
    Dept VARCHAR2(30),&lt;br&gt;
    Email VARCHAR2(50) UNIQUE&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses (&lt;br&gt;
    CourseID NUMBER PRIMARY KEY,&lt;br&gt;
    CourseName VARCHAR2(50) NOT NULL,&lt;br&gt;
    Credits NUMBER(2) CHECK (Credits BETWEEN 1 AND 5)&lt;br&gt;
);&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Data Insertion
&lt;/h2&gt;

&lt;p&gt;Next, I inserted some sample data into the tables.&lt;/p&gt;

&lt;p&gt;INSERT INTO Students VALUES (1, 'Aarav Kumar', 'Computer Science', TO_DATE('2004-05-12','YYYY-MM-DD'), '&lt;a href="mailto:aarav.cs@example.com"&gt;aarav.cs@example.com&lt;/a&gt;');&lt;br&gt;
INSERT INTO Students VALUES (2, 'Meera Reddy', 'Electrical', TO_DATE('2003-09-23','YYYY-MM-DD'), '&lt;a href="mailto:meera.ee@example.com"&gt;meera.ee@example.com&lt;/a&gt;');&lt;br&gt;
INSERT INTO Students VALUES (3, 'Vikram Sharma', 'Mechanical', TO_DATE('2004-01-30','YYYY-MM-DD'), '&lt;a href="mailto:vikram.me@example.com"&gt;vikram.me@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Altering Tables
&lt;/h2&gt;

&lt;p&gt;Adding a new column PhoneNo for storing 10-digit mobile numbers:&lt;/p&gt;

&lt;p&gt;ALTER TABLE Students&lt;br&gt;
ADD PhoneNo VARCHAR2(10);&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Queries with String Functions
&lt;/h2&gt;

&lt;p&gt;Example: Display student names in uppercase and the length of their email IDs.&lt;/p&gt;

&lt;p&gt;SELECT UPPER(Name) AS StudentName_Uppercase,&lt;br&gt;
       LENGTH(Email) AS Email_Length&lt;br&gt;
FROM Students;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Joins &amp;amp; Views
&lt;/h2&gt;

&lt;p&gt;Created an Enrollments table to link students with courses and store grades.&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments (&lt;br&gt;
    StudentID NUMBER REFERENCES Students(StudentID),&lt;br&gt;
    CourseID NUMBER REFERENCES Courses(CourseID),&lt;br&gt;
    Grade VARCHAR2(2)&lt;br&gt;
);&lt;/p&gt;

&lt;h2&gt;
  
  
  Then created a view to see student-course-grade details:
&lt;/h2&gt;

&lt;p&gt;CREATE OR REPLACE VIEW StudentCoursesView AS&lt;br&gt;
SELECT s.Name AS StudentName, c.CourseName, e.Grade&lt;br&gt;
FROM Students s&lt;br&gt;
JOIN Enrollments e ON s.StudentID = e.StudentID&lt;br&gt;
JOIN Courses c ON e.CourseID = c.CourseID;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Aggregates &amp;amp; Grouping
&lt;/h2&gt;

&lt;p&gt;Example: Find the average credits of all courses and the total number of students enrolled.&lt;/p&gt;

&lt;p&gt;SELECT AVG(Credits) AS AvgCredits,&lt;br&gt;
       COUNT(DISTINCT StudentID) AS TotalStudents&lt;br&gt;
FROM Enrollments e&lt;br&gt;
JOIN Courses c ON e.CourseID = c.CourseID;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This mini project gave me hands-on practice with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL DDL (table creation, alteration)&lt;/li&gt;
&lt;li&gt;SQL DML (insertion, updates)&lt;/li&gt;
&lt;li&gt;Constraints&lt;/li&gt;
&lt;li&gt;Queries using string &amp;amp; aggregate functions&lt;/li&gt;
&lt;li&gt;Joins and Views&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a simple yet effective way to strengthen SQL concepts using Oracle LiveSQL 🚀.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohc3pkqsg7bpr9rb8grh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohc3pkqsg7bpr9rb8grh.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp621dtvj23nw21q2viw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp621dtvj23nw21q2viw1.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfj5w92votcl548a9gdh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkfj5w92votcl548a9gdh.png" alt=" " width="800" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuu5xxbigwi16od5w8bys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuu5xxbigwi16od5w8bys.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
