create table student(student_id varchar2(10), first varchar2(50), last varchar2(50), grade number)
create table teacher(teacher_id varchar2(10), first varchar2(50), last varchar2(50), salary number, join_date date)
create table course (course_id varchar2(10), course_name varchar2(50), teacher_id varchar2(10), start_date DATE, end_date DATE)
create table attends (student_id varchar2(10), course_id varchar2(10))
ALTER TABLE student ADD CONSTRAINT student_pk PRIMARY KEY (student_id)
ALTER TABLE teacher ADD CONSTRAINT teacher_pk PRIMARY KEY (teacher_id)
ALTER TABLE course ADD CONSTRAINT course_pk PRIMARY KEY (course_id)
ALTER TABLE attends ADD CONSTRAINT attends_pk PRIMARY KEY (student_id, course_id)
ALTER TABLE course
ADD CONSTRAINT course_fk
FOREIGN KEY (teacher_id)
REFERENCES teacher (teacher_id)
ALTER TABLE attends
ADD CONSTRAINT student_fk
FOREIGN KEY (student_id)
REFERENCES student (student_id)
ALTER TABLE attends
ADD CONSTRAINT course_fk2
FOREIGN KEY (course_id)
REFERENCES course (course_id)
insert into teacher values('t1', 'Beda', 'Hammerschmidt', 0, sysdate)
insert into teacher values('t2', 'Blaine', 'Carter', 5000, sysdate)
insert into course values('c1', 'Databases', 't1', to_date('1-FEB-20'), to_date('20-JUN-20'))
insert into course values('c2', 'JSON', 't1', to_date('1-FEB-20'), to_date('20-JUN-20'))
insert into course values('c3', 'Pragramming', 't2', to_date('1-FEB-20'), to_date('20-JUN-20'))
insert into course values('c4', 'Math', null, null, null)
insert into student values('s1', 'Mickey', 'Mouse', 1)
insert into student values('s2', 'Donald', 'Duck', 1)
insert into attends values('s1', 'c1')
insert into attends values('s1', 'c3')
insert into attends values('s1', 'c4')
insert into attends values('s1', 'c99')
select first, last
from student s
where student_id not in (select student_id from attends)
select DISTINCT t.first, t.last
from student s, teacher t, attends a, course c
where s.student_id = a.student_id
and a.course_id = c.course_id
and c.teacher_id = t.teacher_id
and s.student_id = 's1'
update course set course_name = 'Algebra'
where course_id = 'c4'
alter table course add (credits number)
alter table teacher add (lang1 varchar2(20), lang2 varchar2(20), lang3 varchar2(20))
create table teacher_languages (teacher_id varchar2(10), language varchar2(20))
SELECT '-------- END OF RELATIONAL MODEL ------- START OF PURE JSON MODEL ------' FROM DUAL;
create table university (data CLOB, check (data IS JSON))
insert into university values('
{
"id": 12345,
"role": "student",
"user": {
"id": "s1",
"first": "Mickey",
"last": "Mouse"
},
"course": [{
"id": "c1",
"name": "Databases",
"startDate": "2020-02-01",
"endDate": "2020-06-20"
},{
"id": "c3",
"name": "Programming",
"startDate": "2020-02-01",
"endDate": "2020-06-20"
},{
"id": "c4",
"name": "Math"
}]
}
')
insert into university values('
{
"id": 12346,
"role": "student",
"user": {
"id": "s2",
"first": "Donald",
"last": "Duck"
},
"course": []
}
')
insert into university values('
{
"id": 12347,
"role": "teacher",
"user": {
"id": "t1",
"first": "Beda",
"last": "Hammerschmidt"
},
"course": [{
"id": "c1",
"name": "Databases",
"startDate": "2020-02-01",
"endDate": "2020-06-20"
},{
"id": "c2",
"name": "JSON",
"startDate": "2020-02-01",
"endDate": "2020-06-20"
}]
}
')
insert into university values('
{
"id": 12348,
"role": "teacher",
"user": {
"id": "t2",
"first": "Blaine",
"last": "Carter"
},
"course": [{
"id": "c3",
"name": "Programming",
"startDate": "2020-02-01",
"endDate": "2020-06-20"
}]
}
')
select data from university u
where u.data.course.size() = 0
create or replace function updateCourseName(
data varchar2,
oldName varchar2,
newName varchar2) return varchar2 as
data_obj JSON_OBJECT_T;
courses_arr JSON_ARRAY_T;
course_obj JSON_OBJECT_T;
begin
data_obj := JSON_OBJECT_T(data);
courses_arr := data_obj.get_array('course');
for i in 0 .. (courses_arr.get_size -1) loop
course_obj := TREAT (courses_arr.get(i) as JSON_OBJECT_T);
if (course_obj.get_string('name') = oldName) then
course_obj.put('name', newName);
end if;
end loop;
return data_obj.to_string;
end;
/
select updateCourseName(u.data, 'Math', 'Algebra')
from university u
where JSON_EXISTS(u.data, '$.course?(@.name == "Math")');
select JSON_TRANSFORM(u.data, SET '$.course?(@.id == "c4").name' = 'Algebra')
from university u;
select jt.*
from university u, JSON_TABLE(u.data, '$'
columns(
user_role varchar2(10) path '$.role',
user_id varchar2(10) path '$.user.id',
user_first varchar2(20) path '$.user.first',
user_last varchar2(20) path '$.user.last',
nested path '$.course[*]' columns (
course_id varchar2(10) path '$.id'
)
)) jt;
with flatJson as (
select jt.*
from university u, JSON_TABLE(u.data, '$'
columns(
user_role varchar2(10) path '$.role',
user_id varchar2(10) path '$.user.id',
user_first varchar2(20) path '$.user.first',
user_last varchar2(20) path '$.user.last',
nested path '$.course[*]' columns (
course_id varchar2(10) path '$.id'
)
)) jt)
select DISTINCT teacher.user_first, teacher.user_last
from flatJson student, flatJson teacher
where student.user_first = 'Mickey'
and student.course_id = teacher.course_id
and teacher.user_role = 'teacher'
and student.user_role = 'student';
insert into university values('
{
"id": 23456,
"role": "teacher",
"user": {
"id": "t3",
"first": "Steven",
"last": "F"
},
languages:["English", "Spanish", "PL/SQL"]
}')
select u.data from university u where json_exists(u.data,'$?(@.languages == "Spanish")');
43 SELECT '----- END OF PURE JSON MODEL -------START OF JSON IN RDBMS MODEL---------' FROM DUAL
create table student_j(id varchar2(20), data CLOB, check (data IS JSON))
create table teacher_j(id varchar2(20), data CLOB, check (data IS JSON))
create table course_j (id varchar2(20), data CLOB, check (data IS JSON))
ALTER TABLE teacher_j ADD CONSTRAINT teacher_j_pk PRIMARY KEY (id);
insert into teacher_j values('t1', '
{
"first": "Beda",
"last": "Hammerschmidt",
"salary" :0
}')
insert into teacher_j values('t2', '
{
"first": "Blaine",
"last": "Carter",
"salary":5000
}')
insert into course_j values('c1','
{
"name": "Databases",
"teacher" :"t1",
"startDate": "2020-02-01",
"endDate": "2020-06-20"
}')
insert into course_j values('c2','
{
"name": "JSON",
"teacher" :"t1",
"startDate": "2020-02-01",
"endDate": "2020-06-20"
}')
insert into course_j values('c3','
{
"name": "Programming",
"teacher" :"t2",
"startDate": "2020-02-01",
"endDate": "2020-06-20"
}')
insert into course_j values('c4','
{
"name": "Math",
"startDate" : "2020-03-15",
"endDate ": "2020-04-15"
}');
insert into student_j values('s1', '
{
"grade": 1,
"first": "Mickey",
"last": "Mouse",
"courses":["c1","c3", "c4"]
}')
insert into student_j values('s2', '
{
"grade": 1,
"first": "Donald",
"last": "Duck",
"courses":[]
}')
update course_j set data = JSON_MergePatch(data, '
{"teacher" :"t2",
"startDate" : "2020-03-15",
"endDate ": "2020-04-15",
"capacity" : 30
}')
where id = 'c4'
select data from course_j where id = 'c4'
select data from student_j s
where s.data.courses.size() = 0
select s.data.first, s.data.last, jt.course_id
from student_j s,
JSON_TABLE(s.data, '$.courses[*]'
columns (course_id varchar2(20) PATH '$')) jt
with student_courses as
(select s.data.first, s.data.last, jt.course_id
from student_j s,
JSON_TABLE(s.data, '$.courses[*]'
columns (course_id varchar2(20) PATH '$')) jt
)
select DISTINCT student_courses.first,
student_courses.last,
teacher.data.first,
teacher.data.last
from student_courses student_courses, course_j course, teacher_j teacher
where student_courses.course_id = course.id
and course.data.teacher = teacher.id
and student_courses.last = 'Mouse';
with student_courses as
(select s.id, s.data.first, s.data.last, jt.course_id
from student_j s,
JSON_TABLE(s.data, '$.courses[*]'
columns (course_id varchar2(20) PATH '$')) jt
)
select JSON_Object('name' value (student.data.first || ' ' || student.data.last),
'teacher' value (
select JSON_ArrayAgg(teacher.data.last)
from teacher_j teacher, course_j course, student_courses student_courses
where student.id = student_courses.id
and student_courses.course_id = course.id
and course.data.teacher = teacher.id
)
) from student_j student;
alter table course_j add (teacher_id generated always as (JSON_VALUE(data, '$.teacher')));
ALTER TABLE course_j
ADD CONSTRAINT course_j_fk
FOREIGN KEY (teacher_id)
REFERENCES teacher_j (id);
delete from teacher_j teacher where teacher.data.last= 'Carter';
insert into course_j (id, data )values('c5',
'{
"name": "PL/SQL",
"teacher" :"t17"
}');
insert into course_j (id, data )values('c5',
'{
"name": "PL/SQL"
}');
CREATE OR REPLACE TRIGGER validateCourse
BEFORE INSERT OR UPDATE ON student_j FOR EACH ROW
DECLARE
o json_object_t;
course_arr json_array_t;
course_id varchar2(20);
n number;
BEGIN
o := new JSON_OBJECT_T(:NEW.data);
course_arr := o.get_array('courses');
for i in 0 .. (course_arr.get_size -1) loop
course_id := course_arr.get_string(i);
select count(1) into n from course_j where id = course_id;
if (n = 0) then
RAISE_APPLICATION_ERROR( -20001,
'course ' || course_id || ' not valid' );
end if;
end loop;
END;
/
insert into student_j values('s3', '
{
"first": "Tintin",
"courses":["c1","c99"]
}')
insert into student_j values('s3', '
{
"first": "Tintin",
"courses":["c1","c2"]
}')