Why is the table view not coming? - sql

I am new to Oracle. The Oracle live SQL shorthand gave ready-made code on the departments and employees model.
I don't understand why the code is not viewing any table although I wrote a select statement. I don't understand the execution protocol.
link
create table departments (
name varchar2(255) not null,
location varchar2(4000),
country varchar2(4000)
)
;
create table employees (
department_id number
constraint employees_department_id_fk
references departments on delete cascade,
name varchar2(50) not null,
email varchar2(255),
cost_center number,
date_hired date,
job varchar2(255)
)
;
insert into departments (
name,
location,
country
) values (
'Security',
'Tanquecitos',
'United States'
);
insert into departments (
name,
location,
country
) values (
'Travel',
'Sugarloaf',
'United States'
);
insert into departments (
name,
location,
country
) values (
'Office of the CEO',
'Dale City',
'United States'
);
insert into departments (
name,
location,
country
) values (
'Security',
'Grosvenor',
'United States'
);
commit;
-- load data
insert into employees (
department_id,
name,
email,
cost_center,
date_hired,
job
) values (
1,
'Gricelda Luebbers',
'gricelda.luebbers#aaab.com',
20,
sysdate - 94,
'Systems Designer'
);
insert into employees (
department_id,
name,
email,
cost_center,
date_hired,
job
) values (
1,
'Dean Bollich',
'dean.bollich#aaac.com',
11,
sysdate - 74,
'Legal Assistant'
);
insert into employees (
department_id,
name,
email,
cost_center,
date_hired,
job
) values (
1,
'Milo Manoni',
'milo.manoni#aaad.com',
21,
sysdate - 68,
'Systems Designer'
);
insert into employees (
department_id,
name,
email,
cost_center,
date_hired,
job
) values (
1,
'Laurice Karl',
'laurice.karl#aaae.com',
78,
sysdate - 73,
'Programmer'
);
select
departments.name department_name,
departments.location location,
departments.country country,
employees.name employee_name,
employees.email email,
employees.cost_center cost_center,
employees.date_hired date_hired,
employees.job job
from
departments,
employees;
This is the output they are showing after running:
Table created.
ORA-02268: referenced table does not have a primary key
1 row(s) inserted.
1 row(s) inserted.
1 row(s) inserted.
1 row(s) inserted.
Statement processed.
ORA-00942: table or view does not exist
ORA-00942: table or view does not exist
ORA-00942: table or view does not exist
ORA-00942: table or view does not exist
ORA-00942: table or view does not exist

Your table departments does not have a primary key, so the constraint in table employees produces an error, and the table employees is not created.
You should refactor your SQL code, adding a proper primary key to the table involved and manage the insert value properly:
create table departments (
id numeric(10) not null
name varchar2(255) not null,
location varchar2(4000),
country varchar2(4000),
CONSTRAINT id PRIMARY KEY (id)
)
;

Related

oracle trigger pl sql

I have a database user that contains four tables department, employee, address and contact info, then stored 5 Records in each table, and wrote the PL/SQL Statement for the following:
Stored a record into employee, address and contact using trigger.
the insert into view is not working ! it results in error ? can you guys help me with this ?
this is my code :
-- Create Tables :
CREATE TABLE address (
code int primary key,
city varchar2(30),
street varchar2(30)
);
create table Department (
DepId int primary key ,
Dep_Name varchar2(30) ,
Dep_adress varchar(30));
create table Employee (
Emp_Id int primary key ,
firstName varchar2(30),
lastName varchar2(30),
salary int,
Dep_Id int references Department (DepId),
Code int references address (code));
CREATE TABLE contact_info (
email varchar2(30) primary key ,
phone int ,
EmpId int references Employee (Emp_Id));
-- insert :
insert into Department values (1,'IT','Amman');
insert into Department values (2,'CS','Jerash');
insert into Department values (3,'accounting','Amman');
insert into Department values (4,'managment','Amman');
insert into Department values (5,'employment','Amman');
insert into address values (50,'Amman','AAA');
insert into address values (60,'Amman','AAB');
insert into address values (70,'Amman','AAC');
insert into address values (80,'Jerash','AAD');
insert into address values (90,'Irbid','AAE');
insert into Employee (Emp_Id,firstName,lastName,salary,Dep_Id,Code) values (1,'john' , 'samo' , 1000 , (select DepId from Department where Dep_Name = 'IT'),(select code from address where street = 'AAA'));
insert into Employee (Emp_Id,firstName,lastName,salary,Dep_Id,Code) values (2,'mark' , 'wol' , 2000 , (select DepId from Department where Dep_Name = 'IT'),(select code from address where street = 'AAB'));
insert into Employee (Emp_Id,firstName,lastName,salary,Dep_Id,Code) values (3,'ahmad' , 'moh' , 1100 , (select DepId from Department where Dep_Name = 'IT'),(select code from address where street = 'AAC'));
insert into Employee (Emp_Id,firstName,lastName,salary,Dep_Id,Code) values (4,'maher' , 'imk' , 1700 , (select DepId from Department where Dep_Name = 'CS'),(select code from address where street = 'AAD'));
insert into Employee (Emp_Id,firstName,lastName,salary,Dep_Id,Code) values (5,'ali' , 'geh' , 1200 , (select DepId from Department where Dep_Name = 'CS'),(select code from address where street = 'AAE'));
insert into contact_info values ('john#gmail.com',0785602200, (select Emp_Id from Employee where salary = 1000));
insert into contact_info values ('mark#gmail.com',0785602201, (select Emp_Id from Employee where salary = 2000));
insert into contact_info values ('ahmad#gmail.com',0785602202, (select Emp_Id from Employee where salary = 1100));
insert into contact_info values ('maher#gmail.com',0785602203, (select Emp_Id from Employee where salary = 1700));
insert into contact_info values ('ali#gmail.com',0785602204, (select Emp_Id from Employee where salary = 1200));
-- trigger :
CREATE VIEW vw_address1 AS
SELECT
code,
city,
street
FROM
address;
CREATE OR REPLACE TRIGGER new_trg2
INSTEAD OF INSERT ON vw_address1
FOR EACH ROW
DECLARE
l_code NUMBER;
BEGIN
-- insert a new address first
INSERT INTO address(code,city, street)
VALUES(:NEW.code,:NEW.city, :NEW.street)
RETURNING code INTO l_code;
END;
insert into vw_address1(code,city,street) values (2,'Amman','AAB');

How to use INSERT INTO SELECT

CREATE TABLE EMPLOYEES (
EMPLOYEEID INT NOT NULL,
DEPARTMENTID INT NOT NULL,
);
CREATE TABLE MANAGERS (
EMPLOYEEID INT NOT NULL,
DEPARTMENTID INT NOT NULL,
ALTER_TIMESTAMP TIMESTAMP NOT NULL
);
I want to insert EMPLOYEES.EMPLOYEEID, EMPLOYEES.DEPARTMENTID, ALTER_TIMESTAMP to MANAGERS table using INSERT INTO SELECT. (ALTER_TIMESTAMP col is current time)
I want this result
enter image description here
this is my code
INSERT INTO MANAGERS
(EMPLOYEEID, DEPARTMENTID, ALTER_TIMESTAMP)
SELECT EMPLOYEEID, DEPARTMENTID, to_char(ALTER_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS:FF3')
FROM EMPLOYEES, DUAL;
but "ORA-00904: "DUAL"."ALTER_TIMESTAMP": invalid identifier"
You have no column named "alter_timestamp" in your table, this is the cause of the error message.
Try the next insert statement:
INSERT INTO MANAGERS
(EMPLOYEEID, DEPARTMENTID, ALTER_TIMESTAMP)
SELECT EMPLOYEEID, DEPARTMENTID, CURRENT_TIMESTAMP
FROM EMPLOYEES;

Select data from table with 2 foreign keys in SQL - invalid identifier

I have a problem with SQL query. I have 3 tables, and I want to select people assigned to projects. Here's my statement:
SELECT e.employee_id, e.name, p.project_name from Employee e, Projects p
INNER JOIN Projects_Employees ON Employee.employee_id = Projects_Employees.employee_id
INNER JOIN Projects ON Projects.project_id = Projects_Employees.project_id;
and the code:
CREATE TABLE Employee (
employee_id NUMBER(10) NOT NULL PRIMARY KEY,
name VARCHAR2(50) NOT NULL,
address VARCHAR2(100) NOT NULL
);
CREATE TABLE Projects (
project_id NUMBER(10) NOT NULL PRIMARY KEY,
project_name VARCHAR(200) NOT NULL
);
CREATE TABLE Projects_Employees (
id NUMBER(10) NOT NULL PRIMARY KEY,
employee_id NUMBER(10) NOT NULL,
project_id NUMBER(10) NOT NULL,
CONSTRAINT employee_fk FOREIGN KEY (employee_id) REFERENCES Employee(employee_id),
CONSTRAINT project_fk FOREIGN KEY (project_id) REFERENCES Projects(project_id)
);
INSERT INTO
Employee(employee_id, name, address) VALUES
(1, 'Joe Doe', '11 Henry Smith St.Chelsea, MA 02150');
INSERT INTO
Employee(employee_id, name, address) VALUES
(2, 'James Doe', '74 East Sierra Ave. Batavia, OH 45103');
INSERT INTO
Projects(project_id, project_name)
VALUES (1, 'YYY');
INSERT INTO
Projects(project_id, project_name)
VALUES (2, 'XXX');
INSERT INTO Projects_Employees(id, project_id, employee_id)
VALUES (1, 1, 1);
INSERT INTO Projects_Employees(id, project_id, employee_id)
VALUES (2, 1, 2);
INSERT INTO Projects_Employees(id, project_id, employee_id)
VALUES (3, 2, 1);
And im getting ORA-00904: "EMPLOYEE"."EMPLOYEE_ID": invalid identifier : http://sqlfiddle.com/#!4/c70f4/1
try this one.
SELECT Employee.name,Projects_Employees.employee_id,Projects.project_name
FROM Projects_Employees
INNER JOIN Employee ON Employee.employee_id = Projects_Employees.employee_id
INNER JOIN Projects ON Projects.project_id = Projects_Employees.project_id;
Because you have given alias e to employees table, you will have to use that alias to refer columns of that table.
You should use following query:
SELECT e.employee_id, e.name, p.project_name
from Employee e
JOIN Projects p on <join condition>
INNER JOIN Projects_Employees ON E.employee_id = Projects_Employees.employee_id
INNER JOIN Projects ON Projects.project_id = Projects_Employees.project_id;
Also, why you have used projects table twice in your query? You can remove one if not needed.

REF querying with object-relational database

So currently my database stands as follows:
//branch table
create type branch_Type as object(bID number(6), branch_id ref branch_Type, b_street varchar2(20), b_city varchar2(20), b_p_code varchar2(8), b_bPhone number(14));
create table branch of branch_Type;
INSERT INTO branch VALUES(branch_Type('901', NULL, 'Market', 'Edinburgh', 'EH5 1AB', '01311235560'));
INSERT INTO branch VALUES(branch_Type('908', NULL, 'Bridge', 'Glasgow', 'G18 1QQ', '01413214556'));
insert into branch SELECT branch_Type('901', ref(e), b_street, b_city, b_p_code, b_bPhone) from branch e where e.BID = '901';
insert into branch SELECT branch_Type('908', ref(e), b_street, b_city, b_p_code, b_bPhone) from branch e where e.BID = '908';
//employee table
create type employee_Type as object(e_bid ref branch_Type, empID number(8), e_street varchar2(20), e_city varchar2(20), e_p_code varchar2(8), e_title varchar2(4), e_firstname_surname varchar2(20), emphomephone number(14), emp_mobile_1_2 number(22), supervisorID number(6), e_position varchar2(20), salary number(5), e_ninum varchar2(8), joindate date);
create table employee of employee_Type;
insert into employee select ref(e), '101', 'Dart', 'Edinburgh', 'EH1 05T', 'Mrs', 'Alison Smith', '01312125555', '0770562344307907812345', NULL, 'Head', '50000', 'NI001', '01-FEB-06'
from branch e where e.bid = '901';
insert into employee select ref(e), '105', 'New', 'Edinburgh', 'EH2 4AB', 'Mr', 'John William', 01312031990, 0790231455107701234567, '101', 'Manager', '40000', 'NI010', '04-MAR-07'
from branch e where e.bid = '901';
insert into employee select ref(e), '108', 'Old', 'Edinburgh', 'EH9 4BB', 'Mr', 'Mark Slack', 01312102211, NULL, '105', 'accountant', '30000', 'NI120', '01-Feb-09'
from branch e where e.bid = 901;
insert into employee select ref(e), '804', 'Adam', 'Edinburgh', 'EH1 6EA', 'Mr', 'Jack Smith', 01311112223, 0781209890, '801', 'Leader', '35000', 'NI810', '05-Feb-08'
from branch e where e.bid = 908;
select e_bid from EMPLOYEE where e_bid = '901'; //query I'm using
I am trying to query the employee table for the bid's that are referenced to branch table, but when I run the worksheet the script output tells me that I have no rows selected.
e_bid is a reference to the branch object and does not refer to the bID column contained in the object. You want:
SELECT e_bid
FROM EMPLOYEE
WHERE DEREF(e_bid).bID = 901;
I see no reason why your BRANCH_TYPE needs to contain a self reference (and when you set it you are creating a duplicate of the branch so there will be one instance where branch_id is NULL and another where it refers to itself).
You are repeating several structures across the tables and a better structure might be:
DROP SEQUENCE EMPLOYEES__ID__SEQ;
DROP TABLE EMPLOYEES;
--DROP TYPE EMPLOYEE_TYPE;
--DROP TABLE BRANCHES;
--DROP TYPE BRANCH_TYPE;
--DROP TYPE PHONENUMBER_TABLE_TYPE;
--DROP TYPE PHONENUMBER_TYPE;
--DROP TYPE ADDRESS_TYPE;
CREATE TYPE ADDRESS_TYPE AS OBJECT(
street varchar2(20),
city varchar2(20),
p_code varchar2(8)
);
/
CREATE TYPE PHONENUMBER_TYPE AS OBJECT(
international varchar2(4),
area varchar2(5),
local varchar2(8)
);
/
CREATE TYPE PHONENUMBER_TABLE_TYPE AS TABLE OF PHONENUMBER_TYPE;
/
CREATE TYPE BRANCH_TYPE AS OBJECT (
ID number(6),
Address ADDRESS_TYPE,
Phone PHONENUMBER_TYPE
);
/
create table branches of branch_type( ID PRIMARY KEY );
INSERT INTO BRANCHES VALUES (
901,
ADDRESS_TYPE( 'Market', 'Edinburgh', 'EH5 1AB' ),
PHONENUMBER_TYPE( '044', '1311', '235560' )
);
INSERT INTO BRANCHES VALUES (
908,
ADDRESS_TYPE( 'Bridge', 'Glasgow', 'G18 1QQ' ),
PHONENUMBER_TYPE( '044', '1413', '214556' )
);
create type employee_Type as object(
branch ref branch_type,
ID number(8),
address ADDRESS_TYPE,
title varchar2(4),
firstname_surname varchar2(20),
homephone PHONENUMBER_TYPE,
mobiles PHONENUMBER_TABLE_TYPE,
supervisor REF EMPLOYEE_TYPE, -- Change this to a REF
position varchar2(20),
salary number(5),
ninum varchar2(8),
joindate date
);
/
create table employees of employee_Type (
ID PRIMARY KEY
) NESTED TABLE mobiles STORE AS employees_mobiles;
CREATE SEQUENCE employees__id__seq;
insert into employees
select ref(b),
101, -- EMPLOYEES__ID__SEQ.NEXTVAL,
ADDRESS_TYPE( 'Dart', 'Edinburgh', 'EH1 05T' ),
'Mrs',
'Alison Smith',
PHONENUMBER_TYPE( '044', '1312', '125555' ),
PHONENUMBER_TABLE_TYPE(
PHONENUMBER_TYPE( '044', '7705', '623443' ),
PHONENUMBER_TYPE( '044', '7907', '812345' )
),
NULL,
'Head',
50000,
'NI001',
DATE '1906-02-01'
from branches b
where b.id = 901;
insert into employees
select ref(b),
102, -- EMPLOYEES__ID__SEQ.NEXTVAL,
ADDRESS_TYPE('New', 'Edinburgh', 'EH2 4AB'),
'Mr',
'John William',
PHONENUMBER_TYPE(NULL, '0131', '2031990'),
PHONENUMBER_TABLE_TYPE (PHONENUMBER_TYPE('44', '07902', '314551'), PHONENUMBER_TYPE('44', '07701', '234567')),
REF(s),
'Manager',
40000,
'NI010',
DATE '2007-03-04'
from branches b,
employees s
where b.id = 901
and s.id = 101;

3 level nesting tables in SQL

I wanted to create following 3 - level structure using Oracle object programming aspects:
- Bosses
- - Managers
- - - Employees
When I want to run script for creating table tab_univ_bosses following exception occurs in last line:
Error at Command Line:31 Column:3
Error report:
SQL Error: ORA-22913: "must specify table name for nested table column or attribute"
*Cause: The storage clause is not specified for a nested table column
or attribute.
*Action: Specify the nested table storage clause for the nested table
column or attribute.
Error starting at line 33 in command:
NESTED TABLE managers STORE AS tab_univ_managers
Error report:
Unknown Command
This is my code:
-- TYPE <EMPLOYEE>
create or replace
TYPE type_Employee AS OBJECT (
name VARCHAR2(30),
department_name VARCHAR2(30),
second_name VARCHAR2(30),
manager REF type_Employee
);
CREATE or replace TYPE type_ListEmployees
AS TABLE OF type_Employee;
-- TYPE <MANAGER>
create or replace
TYPE type_Manager AS OBJECT (
userData type_Employee,
manager REF type_Employee,
listEmployees type_ListEmployees
);
NESTED TABLE listEmployees STORE AS tab_univ_employees
CREATE or replace TYPE type_ListManagers
AS TABLE OF type_ListEmployees;
-- BASE TABLE
CREATE TABLE tab_univ_bosses (
id NUMBER PRIMARY KEY,
userData type_Employee,
managers type_ListManagers
);
NESTED TABLE managers STORE AS tab_univ_managers <--- There is a problem...
You can do this using a single table:
create or replace
TYPE type_Employee AS OBJECT (
name VARCHAR2(30),
department_name VARCHAR2(30),
second_name VARCHAR2(30),
manager REF type_Employee
);
/
CREATE TABLE Employees OF type_Employee (
manager SCOPE IS Employees
)
/
INSERT INTO Employees VALUES ( 'Big', 'Admin', 'Boss', NULL );
INSERT INTO Employees VALUES ( 'Middle', 'Accounts', 'Manager', ( SELECT REF(e) FROM Employees e WHERE name = 'Big' AND second_name = 'Boss' ) );
INSERT INTO Employees VALUES ( 'Other', 'Sales', 'Manager', ( SELECT REF(e) FROM Employees e WHERE name = 'Big' AND second_name = 'Boss' ) );
INSERT INTO Employees VALUES ( 'Junior', 'Accounts', 'Accountant', ( SELECT REF(e) FROM Employees e WHERE name = 'Middle' AND second_name = 'Manager' ) );
INSERT INTO Employees VALUES ( 'Junior', 'Sales', 'Salesman', ( SELECT REF(e) FROM Employees e WHERE name = 'Other' AND second_name = 'Manager' ) );
-- Get everyone in hierarchical order.
SELECT name, second_name, department_name, LEVEL
FROM Employees e
START WITH manager IS NULL
CONNECT BY PRIOR name = DEREF( e.MANAGER ).name
AND PRIOR second_name = DEREF( e.MANAGER ).second_name
ORDER SIBLINGS BY name, second_name;
-- Get the employees which have the manager: 'Middle', 'Manager'
SELECT name, second_name, department_name
FROM Employees e
WHERE DEREF( e.Manager ).Name = 'Middle'
AND DEREF( e.Manager ).Second_Name = 'Manager';
However if you really want to use that structure then:
create or replace
TYPE type_Employee AS OBJECT (
name VARCHAR2(30),
department_name VARCHAR2(30),
second_name VARCHAR2(30),
manager REF type_Employee
);
/
CREATE or replace TYPE type_ListEmployees
AS TABLE OF type_Employee;
/
create or replace
TYPE type_Manager AS OBJECT (
userData type_Employee,
manager REF type_Employee,
listEmployees type_ListEmployees
);
/
CREATE or replace TYPE type_ListManagers
AS TABLE OF type_Manager;
/
CREATE TABLE tab_univ_bosses (
id NUMBER PRIMARY KEY,
userData type_Employee,
managers type_ListManagers
)
NESTED TABLE managers STORE AS tab_univ_managers (
NESTED TABLE listEmployees STORE AS tab_univ_employees
);
/