28. 28
SQL> create user DEV_TESTING
2 identified by MYPASS;
create user DEV_TESTING identified by MYPASS
*
ERROR at line 1:
ORA-65096: invalid common user or role name
?
41. 41
SQL> desc T
Name Null? Type
----------------------------- -------- -------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SQL> desc T_AUDIT
Name Null? Type
----------------------------- -------- --------------
AUDIT_DATE DATE
AUDIT_ACTION VARCHAR2(1)
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
42. 42
SQL> create or replace
2 trigger AUDIT_TRG
3 after insert or update or delete on T
4 for each row
5 declare
6 v_action varchar2(1) := case when updating then 'U'
7 when deleting then 'D' else 'I' end;
8 begin
9 if updating or inserting then
10 insert into T_AUDIT
11 values (sysdate
12 ,v_action
13 ,:new.owner
14 ,:new.object_name);
15 else
16 insert into T_AUDIT
17 values (sysdate
18 ,v_action
19 ,:old.owner
20 ,:old.object_name);
21 end if;
22 end;
23 /
Trigger created.
47. 47
create or replace
package T_PKG is
type each_row is record ( action varchar2(1),
owner varchar2(30),
object_name varchar2(30)
);
type row_list is table of each_row
index by pls_integer;
g row_list;
end;
/
48. 48
create or replace
trigger AUDIT_TRG1
before insert or update or delete on T
begin
t_pkg.g.delete;
end;
/
49. 49
create or replace
trigger AUDIT_TRG2
after insert or update or delete on T
for each row
begin
if updating or inserting then
t_pkg.g(t_pkg.g.count+1).owner := :new.owner;
t_pkg.g(t_pkg.g.count).object_name := :new.object_name;
else
t_pkg.g(t_pkg.g.count).owner := :old.owner;
t_pkg.g(t_pkg.g.count).object_name := :old.object_name;
end if;
end;
/
50. 50
create or replace
trigger AUDIT_TRG3
after insert or update or delete on T
declare
v_action varchar2(1) :=
case when updating then 'U'
when deleting then 'D'
else 'I' end;
begin
forall i in 1 .. t_pkg.g.count
insert into T_AUDIT
values (
sysdate,
v_action,
t_pkg.g(i).owner,
t_pkg.g(i).object_name);
t_pkg.g.delete;
end;
/
51. 51
SQL> insert into T
2 select owner, object_name
3 from all_objects
4 where rownum <= 10000;
INSERT INTO T_AUDIT
VALUES
( SYSDATE, :B1 , :B2 , :B3 )
10000 rows created.
call count cpu elapsed disk query current
------- ------ ------- --------- -------- ---------- ----------
Parse 1 0.00 0.00 0 0 0
Execute 1 0.04 0.03 0 90 478
Fetch 0 0.00 0.00 0 0 0
------- ------ ------- --------- -------- ---------- ----------
total 2 0.04 0.03 0 90 478
64. SQL> alter table EMP add
2 CREATE_TS timestamp default systimestamp;
SQL> update EMP
2 set sal = sal*10
3 where empno = 7369;
SQL> delete from EMP
2 where empno = 7934;
SQL> update EMP
2 set job = 'SALES'
3 where ename = 'SMITH';
SQL> update EMP
2 set comm = 1000
3 where empno = 7369;
SQL> commit;
64
65. SQL> select empno, ename, job, sal, comm,
2 nvl(VERSIONS_STARTTIME,CREATE_TS) TS
3 ,nvl(VERSIONS_OPERATION,'I') OP
4 from EMP
5 versions between timestamp
6 timestamp '2014-02-11 20:12:00' and
7 systimestamp
8 order by empno;
EMPNO ENAME JOB SAL COMM TS OP
---------- ---------- --------- ---------- ---------- ------------ --
7369 SMITH CLERK 806 08.10.51 PM I
7369 SMITH SALES 8060 1000 08.12.10 PM U
7499 ALLEN SALESMAN 1606 300000000 08.10.51 PM I
7521 WARD SALESMAN 1256 500000000 08.10.51 PM I
7566 JONES MANAGER 2981 08.10.51 PM I
7900 JAMES CLERK 956 08.10.51 PM I
7902 FORD ANALYST 3006 08.10.51 PM I
7934 MILLER CLERK 1306 08.10.51 PM I
7934 MILLER CLERK 1306 08.12.10 PM D
...
65
109. SQL> select * from emp_temporal
2 order by empno, start_dt;
EMPNO NAME SAL DEPTNO START_DT END_DT
---------- --------- ---------- ---------- --------- ---------
7369 SMITH 806 20 01-JAN-14 01-MAR-14
7369 SMYTH 806 21 02-MAR-14 01-SEP-14
7369 SMYTH 950 21 02-SEP-14 01-OCT-14
7499 ALLEN 1606 30 01-JAN-14 01-MAR-14
7521 WARD 1256 30 01-JAN-14 01-MAR-14
7566 JONES 2981 20 01-JAN-14 01-MAR-14
7654 MARTIN 1256 30 01-JAN-14 01-MAR-14
7698 BLAKE 2856 30 01-JAN-14 01-MAR-14
110. SQL> select * from emp_temporal
2 as of period for valid_range '01-FEB-14';
EMPNO NAME SAL DEPTNO START_DT END_DT
---------- --------- --------- ---------- --------- --------
7369 SMITH 806 20 01-JAN-14 01-MAR-14
7499 ALLEN 1606 30 01-JAN-14 01-MAR-14
7521 WARD 1256 30 01-JAN-14 01-MAR-14
7566 JONES 2981 20 01-JAN-14 01-MAR-14
7654 MARTIN 1256 30 01-JAN-14 01-MAR-14
120. 120
DECODE(BITAND("A209"."PROPERTY",8192),8192,'NESTED TABLE','TABLE')
"OBJECT_TYPE",
2 "OBJECT_TYPE_ID",5 "SEGMENT_TYPE_ID",
"A209"."OBJ#" "OBJECT_ID",
"A209"."FILE#" "HEADER_FILE",
"A209"."BLOCK#" "HEADER_BLOCK",
"A209"."TS#" "TS_NUMBER" FROM "SYS"."TAB$" "A209" WHERE
BITAND("A209"."PROPERTY",1024)=0) UNI
ON ALL (SELECT 'TABLE PARTITION' "OBJECT_TYPE",19 "OBJECT_TYPE_ID",5
"SEGMENT_TYPE_ID",
"A208"."OBJ#" "OBJECT_ID",
"A208"."FILE#" "HEADER_FILE",
"A208"."BLOCK#" "HEADER_BLOCK",
"A208"."TS#" "TS_NUMBER" FROM "SYS"."TABPART$" "A208") UNION ALL
(SELECT 'CLUSTER' "OBJECT_TYPE",3 "OBJECT_TYPE_ID",5 "SEGMENT_TYPE_ID",
"A207"."OBJ#" "OBJECT_ID",
"A207"."FILE#" "HEADER_FILE",
"A207"."BLOCK#" "HEADER_BLOCK",
"A207"."TS#" "TS_NUMBER" FROM "SYS"."CLU$" "A207") UNION ALL
(SELECT DECODE("A206"."TYPE#",8,'LOBINDEX','INDEX') "OBJECT_TYPE",1
"OBJECT_TYPE_ID",6 "SEGMENT_TYPE_ID",
"A206"."OBJ#" "OBJECT_ID",
"A206"."FILE#" "HEADER_FILE",
"A206"."BLOCK#" "HEADER_BLOCK",
"A206"."TS#" "TS_NUMBER" FROM "SYS"."IND$" "A206" WHERE "A206"."TYPE#"=1 OR
"A206"."TYPE#"=2 OR
"A206"."TYPE#"=3 OR
"A206"."TYPE#"=4 OR
"A206"."TYPE#"=6 OR
"A206"."TYPE#"=7 OR
"A206"."TYPE#"=8 OR
"A206"."TYPE#"=9) UNION ALL
(SELECT 'INDEX PARTITION'
"OBJECT_TYPE",20 "OBJECT_TYPE_ID",6 "SEGMENT_TYPE_ID",
"A205"."OBJ#" "OBJECT_ID",
"A205"."FILE#" "HEADER_FILE",
"A205"."BLOCK#" "HEADER_BLOCK",
121. 121
"A205"."TS#" "TS_NUMBER" FROM "SYS"."INDPART$" "A205") UNION ALL
(SELECT 'LOBSEGMENT' "OBJECT_TYPE",21 "OBJECT_TYPE_ID",8 "SEGMENT_TYPE_ID",
"A204"."LOBJ#" "OBJECT_ID",
"A204"."FILE#" "HEADER_FILE",
"A204"."BLOCK#" "HEADER_BLOCK",
"A204"."TS#" "TS_NUMBER" FROM "SYS"."LOB$" "A204" WHERE
BITAND("A204"."PROPERTY",64)=0 OR
BITAND("A204"."PROPERTY",128)=128) UNION ALL
(SELECT 'TABLE SUBPARTITION' "OBJECT_TYPE",34 "OBJECT_TYPE_ID",5
"SEGMENT_TYPE_ID",
"A203"."OBJ#" "OBJECT_ID",
"A203"."FILE#" "HEADER_FILE",
"A203"."BLOCK#" "HEADER_BLOCK",
"A203"."TS#" "TS_NUMBER" FROM "SYS"."TABSUBPART$" "A203") UNION ALL
(SELECT 'INDEX SUBPARTITION' "OBJECT_TYPE",35 "OBJECT_TYPE_ID",6
"SEGMENT_TYPE_ID",
"A202"."OBJ#" "OBJECT_ID",
"A202"."FILE#" "HEADER_FILE",
"A202"."BLOCK#" "HEADER_BLOCK",
"A202"."TS#" "TS_NUMBER" FROM "SYS"."INDSUBPART$" "A202") UNION ALL
(SELECT DECODE("A201"."FRAGTYPE$",'P','LOB PARTITION','LOB SUBPARTITION')
"OBJECT_TYPE",DECODE("A201"."FRAGTYPE$",'P',40,41) "OBJECT_TYPE_ID",8
"SEGMENT_TYPE_ID",
"A201"."FRAGOBJ#" "OBJECT_ID",
"A201"."FILE#" "HEADER_FILE",
"A201"."BLOCK#" "HEADER_BLOCK",
"A201"."TS#" "TS_NUMBER" FROM "SYS"."LOBFRAG$" "A201")) "A196",
"SYS"."SEG$" "A195",
"SYS"."FILE$" "A194" WHERE "A195"."FILE#"="A196"."HEADER_FILE" AND
"A195"."BLOCK#"="A196"."HEADER_BLOCK" AND
"A195"."TS#"="A196"."TS_NUMBER" AND
"A195"."TS#"="A197"."TS#" AND
"A198"."OBJ#"="A196"."OBJECT_ID" AND
"A198"."OWNER#"="A199"."USER#"(+) AND
"A195"."TYPE#"="A196"."SEGMENT_TYPE_ID" AND
"A198"."TYPE#"="A196"."OBJECT_TYPE_ID" AND
"A195"."TS#"="A194"."TS#" AND
122. 122
"A195"."FILE#"="A194"."RELFILE#") UNION ALL
(SELECT NVL("A193"."NAME",'SYS') "OWNER",
"A191"."NAME" "SEGMENT_NAME",NULL "PARTITION_NAME",
DECODE("A190"."TYPE#",1,'ROLLBACK',10,'TYPE2 UNDO') "SEGMENT_TYPE",
"A190"."TYPE#" "SEGMENT_TYPE_ID",NULL "SEGMENT_SUBTYPE",
"A192"."TS#" "TABLESPACE_ID",
"A192"."NAME" "TABLESPACE_NAME",
"A192"."BLOCKSIZE" "BLOCKSIZE",
"A189"."FILE#" "HEADER_FILE",
"A190"."BLOCK#" "HEADER_BLOCK",
"A190"."BLOCKS"*"A192"."BLOCKSIZE" "BYTES",
"A190"."BLOCKS" "BLOCKS",
"A190"."EXTENTS" "EXTENTS",
"A190"."INIEXTS"*"A192"."BLOCKSIZE" "INITIAL_EXTENT",
"A190"."EXTSIZE"*"A192"."BLOCKSIZE" "NEXT_EXTENT",
"A190"."MINEXTS" "MIN_EXTENTS",
"A190"."MAXEXTS" "MAX_EXTENTS",DECODE(BITAND("A190"."SPARE1",4194304),4194304,
"A190"."BITMAPRANGES",NULL) "MAX_SIZE",NULL "RETENTION",NULL "MINRETENTION",
"A190"."EXTPCT"
"PCT_INCREASE",DECODE(BITAND("A192"."FLAGS",32),32,TO_NUMBER(NULL),DECODE("A190"
."LISTS",0,1,
"A190"."LISTS"))
"FREELISTS",DECODE(BITAND("A192"."FLAGS",32),32,TO_NUMBER(NULL),
DECODE("A190"."GROUPS",0,1,"A190"."GROUPS")) "FREELIST_GROUPS",
"A190"."FILE#" "RELATIVE_FNO",BITAND("A190"."CACHEHINT",3)
"BUFFER_POOL_ID",BITAND("A190"."CACHEHINT",12)/4 "FLASH_CACHE",
BITAND("A190"."CACHEHINT",48)/16 "CELL_FLASH_CACHE",NVL("A190"."SPARE1",0)
"SEGMENT_FLAGS",
"A191"."US#" "SEGMENT_OBJD" FROM "SYS"."USER$" "A193","SYS"."TS$" "A192",
"SYS"."UNDO$" "A191",
"SYS"."SEG$" "A190",
"SYS"."FILE$" "A189" WHERE "A190"."FILE#"="A191"."FILE#" AND
"A190"."BLOCK#"="A191"."BLOCK#" AND
"A190"."TS#"="A191"."TS#" AND
"A190"."TS#"="A192"."TS#" AND
"A190"."USER#"="A193"."USER#"(+) AND
("A190"."TYPE#"=1 OR
"A190"."TYPE#"=10) AND
"A191"."STATUS$"<>1 AND
123. 123
"A191"."TS#"="A189"."TS#" AND
"A191"."FILE#"="A189"."RELFILE#") UNION ALL
(SELECT NVL("A188"."NAME",'SYS') "OWNER",
TO_CHAR("A185"."FILE#")||'.'||TO_CHAR("A186"."BLOCK#") "SEGMENT_NAME",NULL
"PARTITION_NAME",
DECODE("A186"."TYPE#",2,'DEFERRED ROLLBACK',3,
'TEMPORARY',4,'CACHE',9,'SPACE HEADER','UNDEFINED') "SEGMENT_TYPE",
"A186"."TYPE#" "SEGMENT_TYPE_ID",NULL "SEGMENT_SUBTYPE",
"A187"."TS#" "TABLESPACE_ID",
"A187"."NAME" "TABLESPACE_NAME",
"A187"."BLOCKSIZE" "BLOCKSIZE",
"A185"."FILE#" "HEADER_FILE",
"A186"."BLOCK#" "HEADER_BLOCK",
"A186"."BLOCKS"*"A187"."BLOCKSIZE" "BYTES",
"A186"."BLOCKS" "BLOCKS",
"A186"."EXTENTS" "EXTENTS",
"A186"."INIEXTS"*"A187"."BLOCKSIZE" "INITIAL_EXTENT",
"A186"."EXTSIZE"*"A187"."BLOCKSIZE" "NEXT_EXTENT",
"A186"."MINEXTS" "MIN_EXTENTS",
"A186"."MAXEXTS" "MAX_EXTENTS",DECODE(BITAND("A186"."SPARE1",4194304),4194304,
"A186"."BITMAPRANGES",NULL) "MAX_SIZE",NULL
"RETENTION",NULL
"MINRETENTION",DECODE(BITAND("A187"."FLAGS",3),1,TO_NUMBER(NULL),
"A186"."EXTPCT")
"PCT_INCREASE",DECODE(BITAND("A187"."FLAGS",32),32,TO_NUMBER(NULL),DECODE("A186"
."LISTS",0,1,
"A186"."LISTS"))
"FREELISTS",DECODE(BITAND("A187"."FLAGS",32),32,TO_NUMBER(NULL),DECODE("A186"."G
ROUPS",0,1,
"A186"."GROUPS")) "FREELIST_GROUPS",
"A186"."FILE#" "RELATIVE_FNO",BITAND("A186"."CACHEHINT",3)
"BUFFER_POOL_ID",BITAND("A186"."CACHEHINT",12)/4
"FLASH_CACHE",BITAND("A186"."CACHEHINT",48)/16
"CELL_FLASH_CACHE",NVL("A186"."SPARE1",0) "SEGMENT_FLAGS",
"A186"."HWMINCR" "SEGMENT_OBJD" FROM "SYS"."USER$"
"A188",
"SYS"."TS$" "A187",
"SYS"."SEG$" "A186",
"SYS"."FILE$" "A185" WHERE "A186"."TS#"="A187"."TS#" AND
"A186"."USER#"="A188"."USER#"(+) AND
"A186"."TYPE#"<>1 AND
"A186"."TYPE#"<>5 AND
124. 124
"A186"."TYPE#"<>6 AND
"A186"."TYPE#"<>8 AND
"A186"."TYPE#"<>10 AND
"A186"."TYPE#"<>11 AND
"A186"."TS#"="A185"."TS#"
AND
"A186"."FILE#"="A185"."RELFILE#") UNION ALL
(SELECT NVL("A184"."NAME",'SYS') "OWNER",'HEATMAP' "SEGMENT_NAME",
NULL "PARTITION_NAME",'SYSTEM STATISTICS' "SEGMENT_TYPE",
"A182"."TYPE#" "SEGMENT_TYPE_ID",NULL "SEGMENT_SUBTYPE",
"A183"."TS#" "TABLESPACE_ID",
"A183"."NAME" "TABLESPACE_NAME",
"A183"."BLO
CKSIZE" "BLOCKSIZE",
"A181"."FILE#" "HEADER_FILE",
"A182"."BLOCK#" "HEADER_BLOCK",
"A182"."BLOCKS"*"A183"."BLOCKSIZE" "BYTES",
"A182"."BLOCKS" "BLOCKS",
"A182"."EXTENTS" "EXTENTS",
"A182"."INIEXTS"*"A183"."BLOCKSIZE" "INITIAL_EXTENT",
"A182"."EXTSIZE"*"A183"."BLOCKSIZE" "NEXT_EXTENT",
"A182"."MINEXTS" "MIN_EXTENTS",
"A182"."MAXEXTS" "MAX_EXTENTS",DECODE(BITAND("A182"."SPARE1",4194304),4194304,
"A182"."BITMAPRANGES",NULL) "MAX_SIZE",NULL "RETENTION",NULL
"MINRETENTION",DECODE(BITAND("A183"."FLAGS",3),1,TO_NUMBER(NULL),
"A182"."EXTPCT")
"PCT_INCREASE",DECODE(BITAND("A183"."FLAGS",32),32,TO_NUMBER(NULL),DEC
ODE("A182"."LISTS",0,1,
"A182"."LISTS"))
"FREELISTS",DECODE(BITAND("A183"."FLAGS",32),32,TO_NUMBER(NULL),DECODE("A182"."G
ROUPS",0,1,
"A182"."GROUPS")) "FREELIST_GROUPS",
"A182"."FILE#" "RELATIVE_FNO",BITAND("A182"."CACHEHINT",3) "BUFFER_POOL_ID",
BITAND("A182"."CACHEHINT",12)/4 "FLASH_CACHE",BITAND("A18
2"."CACHEHINT",48)/16 "CELL_FLASH_CACHE",NVL("A182"."SPARE1",0) "SEGMENT_FLAGS",
"A182"."HWMINCR" "SEGMENT_OBJD" FROM "SYS"."USER$" "A184",
125. 125
"SYS"."TS$" "A183",
"SYS"."SEG$" "A182",
"SYS"."FILE$" "A181" WHERE "A182"."TS#"="A183"."TS#" AND
"A182"."USER#"="A184"."USER#"(+) AND
"A182"."TYPE#"=11 AND
"A182"."TS#"="A181"."TS#" AND
"A182"."FILE#"="A181"."RELFILE#")) "A4") "A3", (SELECT "A5"."NAME" "OWNER",
"A6"."NAME" "OBJECT_NAME",
"A6"."SUBNAME" "SUBOBJECT_NAME",
"A6"."OBJ#" "OBJECT_ID",
"A6"."DATAOBJ#" "DATA_OBJECT_ID",DECODE("A6"."TYPE#",0,'NEXT OBJECT',1,'INDEX',
2,'TABLE',3,'CLUSTER',4,'VIEW',5,'SYNONYM
',6,'SEQUENCE',7,'PROCEDURE',8,'FUNCTION',9,'PACKAGE',11,'PACKAGE BODY',12,
'TRIGGER',13,'TYPE',14,'TYPE BODY',19,'TABLE PARTITION',20,'INDEX PARTITION',
21,'LOB',22,'LIBRARY',23,'DIRECTORY',24,'QUEUE',28,'JAVA SOURCE',29,'JAVA CLASS',30,
'JAVA RESOURCE',32,'INDEXTYPE',33,'OPERATOR',34,
'TABLE SUBPARTITION',35,'INDEX SUBPARTITION',40,'LOB PARTITION',41,'LOB SUBPARTITION',42
,NVL( (SELECT 'REWRITE EQUIVALENCE' "'REWRITEEQUIVALENCE'" FROM SYS."SUM$" "A52" WHERE
"A52"."OBJ#"="A6"."OBJ#" AND
BITAND("A52"."XPFLAGS",8388608)=8388608),'MATERIALIZED VIEW'),43,'DIMENSION',
44,'CONTEXT',46,'RULE SET',47,'RESOURCE PLAN',48,'CONSUMER GROUP',55,'XML SCHEMA',56,'JAVA
DATA',57,'EDITION',59,'RULE',
60,'CAPTURE',61,'APPLY',62,'EVALUATION CONTEXT',66,'JOB',67,'PROGRAM',68,'JOB CLASS',69,
'WINDOW',72,'SCHEDULER GROUP',74,'SCHEDULE',79,'CHAIN',81,'FILE GROUP',82,'MINING
MODEL',87,'ASSEMBLY',90,'CREDENTIAL',92,'CUBE
DIMENSION',93,'CUBE',94,'MEASURE FOLDER',95,'CUBE BUILD PROCESS',100,'FILE WATCHER',
101,'DESTINATION',114,'SQL TRANSLATION PROFILE',115,'UNIFIED AUDIT POLICY','UNDEFINED')
"OBJECT_TYPE",
"A6"."CTIME" "CREATED",
"A6"."MTIME" "LAST_DDL_TIME",TO_CHAR("A6"."STIME",'YYYY-MM-DD:HH24:MI:SS') "TIMESTAMP",DEC
ODE("A6"."STATUS",0,'N/A',1,'VALID','INVALID')
"STATUS",DECODE(BITAND("A6"."FLAGS",2),0,'N',2,'Y','N')
"TEMPORARY",DECODE(BITAND("A6"."FLAGS",4),0,'N',4,'Y','N')
"GENERATED",DECODE(BITAND("A6"."FLAGS",16),0,'N',16,'Y','N') "SECONDARY",
"A6"."NAMESPACE" "NAMESPACE",
"A6"."DEFINING_EDITION" "EDITION_NAM
E",DECODE(BITAND("A6"."FLAGS",196608),65536,'METADATA LINK',131072,'OBJECT LINK','NONE')
"SHARING",
CASE WHEN ("A6"."TYPE#"=4 OR
"A6"."TYPE#"=5 OR
128. SQL> variable c clob
SQL> begin
2 dbms_utility.expand_sql_text(
3 q'{select * from emp_temporal
4 as of period for valid_range '01-FEB-14'}',:c);
6 end;
7 /
129. SQL> print c
C
------------------------------------------------
SELECT
"A1"."EMPNO"
...
FROM (
SELECT "A2"."EMPNO" "EMPNO",
"A2"."NAME"
FROM "SCOTT"."EMP_TEMPORAL" "A2"
WHERE ("A2"."START_DT" IS NULL
OR "A2"."START_DT"<='01-FEB-14')
AND ("A2"."END_DT" IS NULL
OR "A2"."END_DT">'01-FEB-14')
) "A1"
131. SQL> desc EMPLOYEE
Name Null? Type
------------------------- -------- ---------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(12,2)
DEPTNO NUMBER(2)
SQL> alter table EMPLOYEE add period for TIME_RANGE;
Table altered.
132. SQL> desc EMPLOYEE
Name Null? Type
------------------------- -------- ---------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(12,2)
DEPTNO NUMBER(2)
still looks the same ?
133. SQL> select column_name , hidden_column
2 from user_tab_cols
3 where table_name = 'EMPLOYEE'
4 order by column_id;
COLUMN_NAME HIDDEN_COLUMN
------------------------------ -------------
EMPNO NO
ENAME NO
JOB NO
MGR NO
HIREDATE NO
SAL NO
COMM NO
DEPTNO NO
TIME_RANGE_START YES
TIME_RANGE_END YES
TIME_RANGE YES
143. SQL> update EMP_TEMPORAL
2 as of period for valid_range '01-FEB-14'
3 set sal = 10
4 where empno = 20;
as of period for valid_range '01-FEB-14'
*
ERROR at line 2:
ORA-08187: snapshot expression not allowed here
144. SQL> update (
2 select * from EMP_TEMPORAL
3 as of period for valid_range '01-FEB-14'
4 where empno = 7369
5 )
6 set sal = 10;
1 rows updated.
145. "Temporal validity is not supported
with a multitenant container
database"
(12.1.0.1)
150. SQL> create table T
2 ( x int,
3 y int);
Table created.
SQL> create index IX on T (x+0);
Index created.
SQL> alter table T set unused column Y;
Table altered.
151. SQL> select column_name, data_default
2 from USER_TAB_COLS
3 where table_name = 'T'
4 order by column_id;
COLUMN_NAME DATA_DEFAULT
------------------------------ ----------------
X
SYS_NC00003$ "X"+0
SYS_C00002_14020720:50:28$
153. SQL> create table T ( c1 int, c2 int, c3 int );
SQL> desc T
Name Null? Type
---------------------------- -------- -------
C1 NUMBER(38)
C2 NUMBER(38)
C3 NUMBER(38)
SQL> alter table T modify c1 invisible;
SQL> desc T
Name Null? Type
---------------------------- -------- -------
C2 NUMBER(38)
C3 NUMBER(38)
155. SQL> alter table T modify c1 visible;
SQL> desc T
Name Null? Type
---------------------------- -------- -------
C2 NUMBER(38)
C3 NUMBER(38)
C1 NUMBER(38)
157. SQL> desc T
Name Null? Type
---------------------- -------- --------------------
C1 NUMBER(38)
C2 NUMBER(38)
C3 NUMBER(38)
SQL> create or replace
2 procedure P is
3 begin
4 insert into T values (1,10,100);
6 end;
SQL> exec P
SQL> select * from T;
C1 C2 C3
---------- ---------- ----------
1 10 100
158. SQL> alter table T modify c1 invisible;
Table altered.
SQL> alter table T modify c1 visible;
Table altered.
SQL> desc T
Name Null? Type
------------------- -------- --------------------
C2 NUMBER(38)
C3 NUMBER(38)
C1 NUMBER(38)
166. SQL> alter table T add c3 int;
Table altered.
SQL> create or replace
2 procedure NEW_APP is
3 begin
4 for i in ( select c1,c2,c3 from T )
5 loop
6 dbms_output.put_line(i.c1);
7 dbms_output.put_line(i.c2);
8 dbms_output.put_line(i.c3);
9 end loop;
10 end;
11 /
Procedure created.
170. SQL> exec BAD_APP
BEGIN BAD_APP; END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00905: object SCOTT.BAD_APP is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
173. SQL> create table T ( c1 int, c2 int invisible);
Table created.
SQL> desc T
Name Null? Type
------------------------- -------- ------------------
C1 NUMBER(38)
SQL> set colinvisible ON
SQL> desc T
Name Null? Type
------------------------- -------- -----------
C1 NUMBER(38)
C2 (INVISIBLE) NUMBER(38)
174.
175. SQL> alter table T add "C3 (INVISIBLE)" int;
Table altered.
SQL> desc T
Name Null? Type
------------------------- -------- ------------
C1 NUMBER(38)
C3 (INVISIBLE) NUMBER(38)
C2 (INVISIBLE) NUMBER(38)
181. 181
SQL> alter table child modify
2 constraint CHILD_FK on delete cascade;
ERROR at line 1:
ORA-00933: SQL command not properly ended
SQL> alter table child add
2 constraint NEW_FK foreign key ( p )
3 references parent ( p ) on delete cascade;
ERROR at line 1:
ORA-02275: such a referential constraint already
exists in the table
195. Lyrics
"Players gonna play, play, play, play, play
Haters gonna hate, hate, hate, hate, hate
Gonna shake, shake, shake, shake, shake
Shake it off, Shake it off
Fakers gonna fake, fake, fake, fake, fake
Shake it off, I shake it off,
I, I, I shake it off, I shake it off,
I, I, I shake it off, I shake it off,
I, I, I shake it off, I shake it off
Hey, hey, hey
Yeah ohhh
Shake it off, I shake it off,
I, I, I shake it off, I shake it off,
I, I, I shake it off, I shake it off
I, I, I shake it off, I shake it off"
207. 207
SQL> create sequence seq;
Sequence created.
SQL> create table T ( pk number , c1 int);
Table created.
SQL> create or replace
2 trigger FILL_IN_PK
3 before insert on T
4 for each row
5 begin
6 select seq.nextval into :new.pk from dual;
7 end;
8 /
Trigger created.
208. 208
SQL> insert into T values (10,20);
1 row created.
SQL> select * from T;
PK C1
---------- ----------
1 20
210. 210
SQL> create or replace
2 trigger FILL_IN_PK
3 before insert on T
4 for each row
5 when ( new.pk is null )
6 begin
7 select seq.nextval into :new.pk from dual;
8 end;
9 /
SQL> insert into T values (20,20);
SQL> select * from T;
PK C1
---------- ----------
1 20
20 20
221. 221
SQL> drop table t purge;
Table dropped.
SQL> create table T
2 ( pk number generated as identity ,
3 c1 int);
Table created.
SQL> select object_id, object_name,
2 object_type from user_objects;
OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ------------------ ------------
414914 T TABLE
414915 ISEQ$$_414914 SEQUENCE
222. 222
SQL> @pr "select * from user_sequences"
SEQUENCE_NAME : ISEQ$$_414914
MIN_VALUE : 1
MAX_VALUE : 9999999999999999999999
INCREMENT_BY : 1
CYCLE_FLAG : N
ORDER_FLAG : N
CACHE_SIZE : 20
LAST_NUMBER : 1
PARTITION_COUNT :
SESSION_FLAG : N
KEEP_VALUE : N
223. 223
SQL> create table T
2 ( pk number
3 generated as identity (cache 1000)
4 , c1 int);
Table created.
SQL> insert into T values (1,2);
insert into T values (1,2)
*
ERROR at line 1:
ORA-32795: cannot insert into a generated always
identity column
229. 229
SQL> create or replace
2 procedure ins(p_pk int, p_status varchar2) is
3 begin
4 if p_status is null then
5 insert into T (pk, status)
6 values (p_pk, default );
7 else
8 insert into T (pk, status)
9 values (p_pk, p_status );
10 end if;
11 end;
12 /
Procedure created.
234. SQL> create or replace procedure P is
2 x int;
3 y int;
4 begin
5
6 x := 10;
7
8 select count(*)
9 into y
10 from all_objects
11 where object_name = 'NUFFIN';
12
13 x := x / y;
14
15 select rownum
16 into x
17 from dual;
18
19 end;
20 /
Procedure created.
235. SQL> exec P;
BEGIN P; END;
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "SCOTT.P", line 13
ORA-06512: at line 1
236. SQL> create or replace procedure P is
2 x int;
3 y int;
4 begin
5
6 x := 10;
7
8 select count(*)
9 into y
10 from all_objects
11 where object_name = 'NUFFIN';
12
13 x := x / y;
14
15 select rownum
16 into x
17 from dual;
18
19 end;
20 /
Procedure created.
238. SQL> create or replace procedure P is
2 x int;
3 y int;
4 begin
5
6 x := 10;
7
8 select count(*)
9 into y
10 from all_objects
11 where object_name = 'NUFFIN';
12
13 x := x / y;
14
15 select rownum
16 into x
17 from dual;
18
19 exception
20 when others then
21 log_error;
22 raise;
23 end;
24 /
239. SQL> exec P;
BEGIN P; END;
*
ERROR at line 1:
ORA-01476: divisor is equal to
zero
ORA-06512: at "SCOTT.P", line 22
240. SQL> create or replace procedure P is
2 x int;
3 y int;
4 begin
5
6 x := 10;
7
8 select count(*)
9 into y
10 from all_objects
11 where object_name = 'NUFFIN';
12
13 x := x / y;
14
15 select rownum
16 into x
17 from dual;
18
19 exception
20 when others then
21 log_error;
22 raise;
23 end;
24 /
?
241. SQL> create or replace procedure P is
2 x int;
3 y int;
4 begin
5
6 x := 10;
7
8 select count(*)
9 into y
10 from all_objects
11 where object_name = 'NUFFIN';
12
13 x := x / y;
14
15 select rownum
16 into x
17 from dual;
18
19 exception
20 when others then
21 dbms_output.put_line(
22 dbms_utility.format_call_stack);
23 raise;
24 end;
25 /
242. SQL> exec P;
----- PL/SQL Call Stack -----
object line object
handle number name
0x14b1e3900 21 procedure SCOTT.P
0x12521b8d8 1 anonymous block
BEGIN P; END;
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "SCOTT.P", line 23
ORA-06512: at line 1
243. SQL> create or replace procedure P is
2 x int;
3 y int;
4 l_debug varchar2(4000);
5 begin
6 l_debug := dbms_utility.format_call_stack;
7
8 x := 10;
9
10 l_debug := dbms_utility.format_call_stack;
11 select count(*)
12 into y
13 from all_objects
14 where object_name = 'NUFFIN';
15
16 l_debug := dbms_utility.format_call_stack;
17 x := x / y;
18
19 l_debug := dbms_utility.format_call_stack;
20 select rownum
21 into x
22 from dual;
23
24 exception
25 when others then
26 dbms_output.put_line(l_debug);
27 raise;
28 end;
244. SQL> exec P;
----- PL/SQL Call Stack -----
object line object
handle number name
0x14b1e3900 16 procedure SCOTT.P
0x12521b8d8 1 anonymous block
BEGIN P; END;
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "SCOTT.P", line 27
ORA-06512: at line 1
245. SQL> create or replace procedure P is
2 x int;
3 y int;
4 l_debug varchar2(4000);
5 begin
6 l_debug := dbms_utility.format_call_stack;
7
...
24 exception
25 when others then
26 l_debug := substr(l_debug,instr(l_debug,chr(10),1,3));
27 l_debug := regexp_replace(l_debug,chr(10)||'.*$');
28 dbms_output.put_line(l_debug);
29 raise;
30 end;
31 /
246. SQL> exec P;
0x14b1e3900 16 procedure SCOTT.P
BEGIN P; END;
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "SCOTT.P", line 29
ORA-06512: at line 1
249. SQL> create or replace procedure P is
2 x int;
3 y int;
4 l_debug varchar2(4000);
5 begin
6 l_debug := dbms_utility.format_call_stack;
7
8 x := 10;
9
...
23
24 exception
25 when others then
26 dbms_output.put_line(
27 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE );
28 raise;
29 end;
250. SQL> exec P;
ORA-06512: at "SCOTT.P", line 17
BEGIN P; END;
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "SCOTT.P", line 27
ORA-06512: at line 1
253. SQL> create or replace procedure P is
2 x int;
3 y int;
4 begin
5 x := 10;
6
...
17
18 exception
19 when others then
20 for i in 1 .. utl_call_stack.dynamic_depth loop
21 dbms_output.put_line(
22 utl_call_stack.unit_line(i)||'-'||
23 utl_call_stack.concatenate_subprogram(
24 utl_call_stack.subprogram(i))
25 );
26 end loop;
27 raise;
28 end;
254. SQL> exec P;
21-P
1-__anonymous_block
BEGIN P; END;
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "SCOTT.P", line 27
ORA-06512: at line 1
257. SQL> create or replace package body PKG is
2
3 procedure p is
...
19
20 exception
21 when others then
22 for i in 1 .. utl_call_stack.dynamic_depth loop
23 dbms_output.put_line(
24 utl_call_stack.unit_line(i)||'-'||
25 utl_call_stack.concatenate_subprogram(
26 utl_call_stack.subprogram(i))
27 );
28 end loop;
29 raise;
30 end;
31
32 procedure p1 is begin p; end;
33 procedure p2 is begin p1; end;
34 procedure p3 is begin p2; end;
35
36 end;
37 /
258. SQL> exec pkg.p3
23-PKG.P
32-PKG.P1
33-PKG.P2
34-PKG.P3
1-__anonymous_block
BEGIN pkg.p3; END;
*
ERROR at line 1:
ORA-01476: divisor is equal to
zero
ORA-06512: at "SCOTT.PKG", line 29
ORA-06512: at "SCOTT.PKG", line 32
ORA-06512: at "SCOTT.PKG", line 33
ORA-06512: at "SCOTT.PKG", line 34
ORA-06512: at line 1
260. SQL> exec pkg.p3
23-PKG.P
32-PKG.P1
33-PKG.P2
34-PKG.P3
1-__anonymous_block
BEGIN pkg.p3; END;
subprogram !!!
*
ERROR at line 1:
ORA-01476: divisor is equal to
zero
ORA-06512: at "SCOTT.PKG", line 29
ORA-06512: at "SCOTT.PKG", line 32
ORA-06512: at "SCOTT.PKG", line 33
ORA-06512: at "SCOTT.PKG", line 34
ORA-06512: at line 1
272. SQL> create or replace
2 function my_initcap(p_string varchar2) return varchar2 is
3 l_string varchar2(1000) := p_string;
4 begin
5 if regexp_like(l_string,'(Mac[A-Z]|Mc[A-Z])') then
6 null;
7 elsif l_string like '''%' then
8 null;
9 else
10 l_string := initcap(l_string);
11 if l_string like '_''S%' then
12 null;
13 else
14 l_string := replace(l_string,'''S','''s');
15 end if;
16 end if;
17
18 return l_string;
19 end;
20 /
Function created.
280. SQL> select
2 case
3 when regexp_like(vendor,'(Mac[A-Z]|Mc[A-Z])') then vendor
4 when vendor like '''%' then vendor
5 when initcap(vendor) like '_''S%' then vendor
6 else replace(initcap(vendor),'''S','''s')
7 end ugh
8 from service_provider;
UGH
-------------------------------
Jones
Brown
Smith
McDonald
Johnson's
281. "Always code as if the person who
ends up maintaining your code is a
psychopathic killer who knows
where you live."
- source unknown
283. SQL> WITH
2 function my_initcap(p_string varchar2)
3 return varchar2 is
4 l_string varchar2(1000) := p_string;
5 begin
6 if regexp_like(l_string,'(Mac[A-Z]|Mc[A-Z])') then
7 null;
8 elsif l_string like '''%' then
...
17
18 return l_string;
19 end;
20 select my_initcap(vendor)
21 from service_provider;
MY_INITCAP(VENDOR)
-----------------------------------------
Jones
Brown
Smith
McDonald
O'Brien
Johnson's
285. SQL> WITH
2 function is_scottish(p_string varchar2) return boolean is
3 begin
4 return regexp_like(p_string,'(Mac[A-Z]|Mc[A-Z])');
5 end;
6 function my_initcap(p_string varchar2) return varchar2 is
7 l_string varchar2(1000) := p_string;
8 begin
9 if is_scottish(l_string) then
10 null;
11 elsif l_string like '''%' then
12 null;
13 else
14 l_string := initcap(l_string);
15 if l_string like '_''S%' then
16 null;
17 else
18 l_string := replace(l_string,'''S','''s');
19 end if;
20 end if;
21
22 return l_string;
23 end;
24 select my_initcap(surname)
25 from names;
26 /
288. SQL> WITH
2 function my_initcap(p_string varchar2) return varchar2 is
3 l_string varchar2(1000) := p_string;
function my_initcap(p_string varchar2) return varchar2 is
*
ERROR at line 2:
ORA-06553: PLS-103: Encountered the symbol "end-of-file" when
expecting one of the following:
. ( * @ % & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || multiset member submultiset
SQL> begin
2 if regexp_like(l_string,'(Mac[A-Z]|Mc[A-Z])') then
3 null;
4 elsif l_string like '''%' then
5 null;
6 else
7 l_string := initcap(l_string);
294. SQL> insert into CONTRACTS
2 WITH
3 function my_initcap(p_string varchar2)
4 return varchar2 is
5 l_string varchar2(1000) := p_string;
6 begin
...
20 end;
21 select my_initcap(vendor)
22 from service_provider;
23 /
WITH
*
ERROR at line 2:
ORA-32034: unsupported use of WITH clause
295. SQL> insert /*+ WITH_PLSQL */ into CONTRACTS
2 WITH
3 function my_initcap(p_string varchar2)
4 return varchar2 is
5 l_string varchar2(1000) := p_string;
6 begin
...
20 end;
21 select my_initcap(surname)
22 from names;
23 /
5 rows inserted.
297. SQL> with
2 function f return timestamp as
3 begin
4 return systimestamp;
5 end;
6 select f
7 from dual
8 connect by level <= 10;
9 /
F
----------------------------------------
05-JAN-14 08.09.43.969000000 PM
05-JAN-14 08.09.43.970000000 PM
05-JAN-14 08.09.43.970000000 PM
05-JAN-14 08.09.43.971000000 PM
...
301. SQL> with
2 function f return timestamp as
3 begin
4 return systimestamp;
5 end;
6 select ( select f from dual )
7 from dual
8 connect by level <= 10;
9 /
F
----------------------------------------
05-JAN-14 08.11.50.145000000 PM
05-JAN-14 08.11.50.145000000 PM
05-JAN-14 08.11.50.145000000 PM
05-JAN-14 08.11.50.145000000 PM
...
303. SQL> create or replace
2 function F return number is
3 begin
4 return 1;
5 end;
6 /
Function created.
304. SQL> select sum(f)
2 from
3 ( select level from dual
4 connect by level <= 1000 ),
5 ( select level from dual
6 connect by level <= 1000 )
7 ;
SUM(F)
----------
1000000
Elapsed: 00:00:02.04
305. SQL> with
2 function f1 return number is
3 begin
4 return 1;
5 end;
6 select sum(f1)
7 from
8 ( select level from dual
9 connect by level <= 1000 ),
10 ( select level from dual
11 connect by level <= 1000 )
12 /
SUM(F1)
----------
1000000
Elapsed: 00:00:00.52
327. SQL> select empno, ename, hiredate
2 from scott.emp
3 order by hiredate desc
4 fetch LAST 5 rows only;
fetch LAST 5 rows only
*
ERROR at line 4:
ORA-00905: missing keyword
327
328. SQL> select *
2 from (
3 select empno, ename, hiredate
4 from scott.emp
5 order by hiredate asc
6 fetch first 5 rows only
7 )
8 order by hiredate desc;
EMPNO ENAME HIREDATE
---------- ---------- ---------
7698 BLAKE 01-MAY-81
7566 JONES 02-APR-81
7521 WARD 22-FEB-81
7499 ALLEN 20-FEB-81
7369 SMITH 17-DEC-80 328
332. "Note that in real life,
you would use bind variables
instead of hard-coded literals"
332
- Tom Kyte,
Oracle Magazine, Sep 13
333. SQL> declare
2 l_num number := 5;
3 begin
4 for i in (
5 select empno, ename, hiredate
6 from scott.emp
7 order by hiredate desc
8 fetch first l_num rows only
9 )
10 loop
11 null;
12 end loop;
13 end;
14 /
declare
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 26618
Session ID: 25 Serial number: 53023
333
334. SQL> declare
2 l_num number := 5;
3 begin
4 for i in (
5 select empno, ename, hiredate
6 from scott.emp
7 order by hiredate desc
8 fetch first cast(l_num as number) rows only
9 )
10 loop
11 null;
12 end loop;
13 end;
14 /
PL/SQL procedure successfully completed.
334
fixed in 12.1.0.2
366. SQL> select acct, ceil(max(finished_losing-started_losing))
2 from account_txns
3 MATCH_RECOGNIZE
4 (
5 partition by acct
6 order by tstamp
7 measures
8 tstamp as tstamp, outcome as outcome,
9 first(still_losing.tstamp) started_losing,
10 got_lucky.tstamp finished_losing
11 one row per match
12 pattern ( still_losing* got_lucky )
13 define
14 still_losing as outcome = 'Lose'
15 and still_losing.outcome =
16 first(still_losing.outcome),
17 got_lucky as outcome = 'Win'
18 )
19 group by acct
20 order by 1,2;
366
375. SQL> desc ACCOUNTS
Name Null? Type
----------------------------- -------- ------------
ID NUMBER(8)
NAME VARCHAR2(30)
EMAIL_ADDRESS VARCHAR2(30)
SQL> select * from ACCOUNTS;
ID NAME EMAIL_ADDRESS
-------- -------------------- -------------------
1 Suzanne suzy_q@yahoo.com
2 John Smith john.smith@hotmail.com
...
377. SQL> conn scott/tiger
Connected.
SQL> select * from ACCOUNTS;
ID NAME EMAIL_ADDRESS
-------- -------------------- -------------------
1 Suzanne xxxx@yahoo.com
2 John Smith xxxx@hotmail.com
...
385. SQL> create table scott.emp2 as
2 select * from scott.emp;
Table created.
SQL> select *
2 from scott.emp e,
3 scott.emp2 e2,
4 scott.dept d
5 where e.deptno = d.deptno(+)
6 and e2.deptno = d.deptno(+)
7 and e.empno = e2.empno
8 /
where e.deptno = d.deptno(+)
*
ERROR at line 5:
ORA-01417: a table may be outer joined to at
most one other table
392. SQL> select e.empno, d.deptno, b.benefits
2 from scott.emp e,
3 ( select benefits
4 from scott.DEPT_BENEFITS d
5 where d.deptno = e.deptno
6 ) b
7 order by 1,3;
where d.deptno = e.deptno
*
ERROR at line 5:
ORA-00904: "E"."DEPTNO": invalid identifier
396. SQL> select e.empno, d.deptno, b.benefits
2 from scott.emp e,
3 ( select benefits
4 from scott.DEPT_BENEFITS d
5
where d.deptno = e.deptno
6 ) b
7
8 order by 1,3;
407. 407
SQL> alter user TO_BE_EDITIONED enable editions;
alter user TO_BE_EDITIONED enable editions
*
ERROR at line 1:
ORA-38819: user TO_BE_EDITIONED owns one or more
objects whose type is editionable and that have
noneditioned dependent objects