show user desc dba_data_files select file_name, tablespace_name, bytes from dba_data_files; select file#, name, checkpoint_change# from v$datafile; desc V$log; desc V$logfile; select group#, archived, status from v$log; select group#, status,member from v$logfile; alter database add logfile group 10 ('log1a.rdo', 'log2a.rdo') size 5000k; alter database add logfile('log1c.rdo', 'log2c.rdo') size 5000k; alter database add logfile member 'log3a.rdo' to group 10; select group#, status,member from v$logfile; alter database drop logfile member 'log1a.rdo'; select group#, status,member from v$logfile; alter database drop logfile group 10; select name, log_mode from v$database; select member from v$logfile; select * from v$controlfile; create tablespace hrtbs1 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS1.DBF' size 50M; create tablespace hrtbs2 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS2_1.DBF' size 50M extent management local uniform size 512K; create tablespace hrtbs3 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS3_1.DBF' size 50M segment space management manual; create tablespace hrtbs4 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS4_1.DBF' size 50M extent management local uniform size 512K segment space management manual; create tablespace indx datafile 'C:\oracle\product\10.2.0\oradata\ORCL\INDEX01.DBF' size 50M; create temporary tablespace hrtemp1 tempfile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTEMP1_1.DBF' size 20M extent management local uniform size 15M; create temporary tablespace hrtemp2 tempfile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTEMP2_1.DBF' size 20M extent management local uniform size 15M tablespace group temp_group; alter tablespace hrtemp1 tablespace group temp_group; create undo tablespace hrundo1 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRUNDO1_1.DBF' size 20M; alter tablespace users add datafile 'C:\oracle\product\10.2.0\oradata\ORCL\USERS02.DBF' size 10M; alter tablespace temp add tempfile 'C:\oracle\product\10.2.0\oradata\ORCL\TEMP02.DBF' size 5M; alter database datafile 'C:\oracle\product\10.2.0\oradata\ORCL\USERS02.DBF' autoextend on next 1M maxsize unlimited; alter database datafile 'C:\oracle\product\10.2.0\oradata\ORCL\USERS02.DBF' autoextend off; alter database datafile 'C:\oracle\product\10.2.0\oradata\ORCL\USERS02.DBF' RESIZE 8M; Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 Connected as system SQL> show user User is "system" SQL> desc dba_data_files Name Type Nullable Default Comments --------------- ------------- -------- ------- --------------------------------------------------- FILE_NAME VARCHAR2(513) Y Name of the database data file FILE_ID NUMBER Y ID of the database data file TABLESPACE_NAME VARCHAR2(30) Y Name of the tablespace to which the file belongs BYTES NUMBER Y Size of the file in bytes BLOCKS NUMBER Y Size of the file in ORACLE blocks STATUS VARCHAR2(9) Y File status: "INVALID" or "AVAILABLE" RELATIVE_FNO NUMBER Y Tablespace-relative file number AUTOEXTENSIBLE VARCHAR2(3) Y Autoextensible indicator: "YES" or "NO" MAXBYTES NUMBER Y Maximum size of the file in bytes MAXBLOCKS NUMBER Y Maximum size of the file in ORACLE blocks INCREMENT_BY NUMBER Y Default increment for autoextension USER_BYTES NUMBER Y Size of the useful portion of file in bytes USER_BLOCKS NUMBER Y Size of the useful portion of file in ORACLE blocks ONLINE_STATUS VARCHAR2(7) Y Online status of the file SQL> select file_name, tablespace_name, bytes from dba_data_files 2 SQL> select file_name, tablespace_name, bytes from dba_data_files 2 SQL> select file_name, tablespace_name, bytes from dba_data_files; FILE_NAME TABLESPACE_NAME BYTES -------------------------------------------------------------------------------- ------------------------------ ---------- C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS 5242880 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX 272629760 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1 73400320 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF SYSTEM 503316480 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLE 104857600 SQL> select file#, name, checkpoint_chang# from v$datafile; select file#, name, checkpoint_chang# from v$datafile ORA-00904: "CHECKPOINT_CHANG#": 标识符无效 SQL> select file#, name, checkpoint_chang# from v$datafile; select file#, name, checkpoint_chang# from v$datafile ORA-00904: "CHECKPOINT_CHANG#": 标识符无效 SQL> select file#, name, checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE# ---------- -------------------------------------------------------------------------------- ------------------ 1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF 1201919 2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF 1201919 3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF 1201919 4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF 1201919 5 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF 1201919 SQL> desc V$log; Name Type Nullable Default Comments ------------- ------------ -------- ------- -------- GROUP# NUMBER Y THREAD# NUMBER Y SEQUENCE# NUMBER Y BYTES NUMBER Y MEMBERS NUMBER Y ARCHIVED VARCHAR2(3) Y STATUS VARCHAR2(16) Y FIRST_CHANGE# NUMBER Y FIRST_TIME DATE Y SQL> desc V$logfile; Name Type Nullable Default Comments --------------------- ------------- -------- ------- -------- GROUP# NUMBER Y STATUS VARCHAR2(7) Y TYPE VARCHAR2(7) Y MEMBER VARCHAR2(513) Y IS_RECOVERY_DEST_FILE VARCHAR2(3) Y SQL> select group#, archived, status from v$log; GROUP# ARCHIVED STATUS ---------- -------- ---------------- 1 NO INACTIVE 2 NO CURRENT 3 NO INACTIVE SQL> select group#, status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- -------------------------------------------------------------------------------- 3 STALE C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG 2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG 1 STALE C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG SQL> alter database add logfile group 10 ('log1a.rdo', 'log2a.rdo') size 5000k; Database altered SQL> alter database add logfile('log1c.rdo', 'log2c.rdo'); alter database add logfile('log1c.rdo', 'log2c.rdo') ORA-00301: 添加日志文件 'log1c.rdo' 时出错 - 无法创建文件 ORA-17610: 文件 'log1c.rdo' 不存在, 大小也未指定 ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 SQL> alter database add logfile('log1c.rdo', 'log2c.rdo') size 5000k; Database altered SQL> alter database add logfile member 'log3a.rdo' to group 10; Database altered SQL> select group#, status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- -------------------------------------------------------------------------------- 3 STALE C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG 2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG 1 STALE C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG 10 C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG1A.RDO 10 C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG2A.RDO 4 C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG1C.RDO 4 C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG2C.RDO 10 INVALID C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG3A.RDO 8 rows selected SQL> alter database drop logfile member 'log1a.rdo'; Database altered SQL> select group#, status,member from v$logfile; GROUP# STATUS MEMBER ---------- ------- -------------------------------------------------------------------------------- 3 STALE C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG 2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG 1 STALE C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG 10 C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG2A.RDO 4 C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG1C.RDO 4 C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG2C.RDO 10 INVALID C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG3A.RDO 7 rows selected SQL> alter database drop logfile group 10; Database altered SQL> archive log list; archive log list ORA-00900: 无效 SQL 语句 SQL> select name, log_mode from v$database; NAME LOG_MODE --------- ------------ ORCL NOARCHIVELOG SQL> select member from v$logfile; MEMBER -------------------------------------------------------------------------------- C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG1C.RDO C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\LOG2C.RDO SQL> select * from v$controlfile; STATUS NAME IS_RECOVERY_DEST_FILE BLOCK_SIZE FILE_SIZE_BLKS ------- -------------------------------------------------------------------------------- --------------------- ---------- -------------- C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL NO 16384 430 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL NO 16384 430 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL NO 16384 430 SQL> SQL> creat tablespace hrtbs1 datafile 'C:\dss\HRTBS1.DBF' size 50M; creat tablespace hrtbs1 datafile 'C:\dss\HRTBS1.DBF' size 50M ORA-00900: 无效 SQL 语句 SQL> create tablespace hrtbs1 datafile 'C:\dss\HRTBS1.DBF' size 50M; create tablespace hrtbs1 datafile 'C:\dss\HRTBS1.DBF' size 50M ORA-01119: 创建数据库文件 'C:\dss\HRTBS1.DBF' 时出错 ORA-27040: 文件创建错误, 无法创建文件 OSD-04002: 无法打开文件 O/S-Error: (OS 3) 系统找不到指定的路径。 SQL> create tablespace hrtbs1 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS1.DBF' size 50M; Tablespace created SQL> create tablespace hrtbs2 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS2_1.DBF' size 50M extent management local uniform size 512K; SQL> Tablespace created SQL> create tablespace hrtbs3 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS3_1.DBF' size 50M segment space management manual; Tablespace created SQL> create tablespace hrtbs4 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS4_1.DBF' size 50M extent management local uniform size 512K segment space management manual; Tablespace created SQL> create tablespace index datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS3_1.DBF' size 50M; create tablespace index datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS3_1.DBF' size 50M ORA-02216: 需要表空间名 SQL> create tablespace indx datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS3_1.DBF' size 50M; create tablespace indx datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS3_1.DBF' size 50M ORA-01537: 无法添加文件 'C:\oracle\product\10.2.0\oradata\ORCL\HRTBS3_1.DBF' - 该文件已是数据库的一部分 SQL> create tablespace indx datafile 'C:\oracle\product\10.2.0\oradata\ORCL\INDEX01.DBF' size 50M; Tablespace created SQL> create temporary tablespace hrtemp1 tempfile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTEMP1_1.DBF' size 20M extent management local uniform size 15M; Tablespace created SQL> create temporary tablespace hrtemp2 tempfile 'C:\oracle\product\10.2.0\oradata\ORCL\HRTEMP2_1.DBF' size 20M extent management local uniform size 15M tablespace group temp_group; Tablespace created SQL> alter tablespace hrtemp1 tablespace group temp_group; Tablespace altered SQL> create undo tablespace hrundo1 tempfile 'C:\oracle\product\10.2.0\oradata\ORCL\HRUNDO1_1.DBF' size 20M; create undo tablespace hrundo1 tempfile 'C:\oracle\product\10.2.0\oradata\ORCL\HRUNDO1_1.DBF' size 20M ORA-02180: 无效的 CREATE TABLESPACE 选项 SQL> create undo tablespace hrundo1 datafile 'C:\oracle\product\10.2.0\oradata\ORCL\HRUNDO1_1.DBF' size 20M; Tablespace created SQL> alter tablespace users add datafile 'C:\oracle\product\10.2.0\oradata\ORCL\USERS02.DBF' size 10M; Tablespace altered SQL> alter tablespace temp add tempfile 'C:\oracle\product\10.2.0\oradata\ORCL\TEMP02.DBF' size 5M; Tablespace altered SQL> alter database datafile 'C:\oracle\product\10.2.0\oradata\ORCL\USERS02.DBF' autoextend on next 1M maxsize unlimited; Database altered SQL> alter database datafile 'C:\oracle\product\10.2.0\oradata\ORCL\USERS02.DBF' autoextend off; Database altered SQL> alter database datafile 'C:\oracle\product\10.2.0\oradata\ORCL\USERS02.DBF' RESIZE 8M; Database altered
1. 横向 SQL> create bigfile tablespace tbs datafile 'c:\3.dbf' size 1G uniform size 512k; Tablespace created SQL> create temporary tablespace ts1 tempfile 'c:\1.dbf' size 20m extent management local uniform size 15m; Tablespace created SQL> create undo tablespace ts2 datafile 'c:\2.dbf' size 20m; Tablespace created 2. 纵向 create temporary tablespace ts2 tempfile 'C:\2.dbf' size 2m reuse autoextend off; create bigfile tablespace ts5 datafile 'C:\5.dbf'size 2m reuse autoextend off; 3. 区管理(本地的,数据字典两种) SQL> create tablespace ts9 datafile 'c:\11.dbf' size 2m reuse ,'c:\12.dbf' size 3m extent management local uniform size 1m; Tablespace created SQL> create tablespace ts5 datafile 'c:\5.dbf' size 2m reuse ,'c:\6.dbf' size 3m extent management local autoallocate; Tablespace created 4. 段管理 SQL> create tablespace ts6 datafile 'c:\7.dbf' size 2m reuse ,'c:\8.dbf' size 3m segment space management manual; Tablespace created SQL> create tablespace ts7 datafile 'c:\9.dbf' size 2m reuse ,'c:\10.dbf' size 3m segment space management auto; Tablespace created 5. 区,段管理 SQL> create tablespace ts10 datafile 'c:\13.dbf' size 2m reuse ,'c:\14.dbf' size 3m extent management local autoallocate segment space management auto; Tablespace created SQL> create tablespace ts11 datafile 'c:\15.dbf' size 2m reuse ,'c:\16.dbf' size 3m extent management local autoallocate segment space management manual; Tablespace created SQL> create tablespace ts12 datafile 'c:\17.dbf' size 2m reuse ,'c:\18.dbf' size 3m extent management local uniform size 1m segment space management manual; Tablespace created SQL> create tablespace ts12 datafile 'c:\17.dbf' size 2m reuse ,'c:\18.dbf' size 3m extent management local uniform size 1m segment space management auto; Tablespace created
1.重命名表空间和数据文件 Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 Connected as system SQL> create tablespace ts1 datafile 'c:\1.dbf' size 2m,'c:\2.dbf' size 3m; SQL> Tablespace created SQL> Alter tablespace ts1 rename to ts2; Tablespace altered SQL> alter tablespace ts2 offline; Tablespace altered SQL> alter tablespace ts2 rename datafile 'c:\1.dbf' to 'e:\cp.dbf'; alter tablespace ts2 rename datafile 'c:\1.dbf' to 'e:\cp.dbf' ORA-01525: 重命名数据文件时出错 ORA-01141: 重命名数据文件 6 时出错 - 未找到新文件 'e:\cp.dbf' ORA-01110: 数据文件 6: 'C:\1.DBF' ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 SQL> alter tablespace ts2 rename datafile 'c:\1.dbf' to 'e:\cp1.dbf'; Tablespace altered SQL> alter tablespace ts2 online; Tablespace altered 2.扩充表空间容量 1.为表空间添加数据文件 (1).向USERS表空间中加入10M的数据文件 SQL> alter tablespace users add datafile 'C:\oracle\product\10.2.0\oradata\orcl\users02.dbf' size 10m; Tablespace altered (2).向TEMP表空间中加入5M的数据文件 SQL> alter tablespace temp add tempfile 'C:\oracle\product\10.2.0\oradata\orcl\temp02.dbf' size 5m; Tablespace altered 改变数据文件的扩展性 (1).将USERS表空间中的数据文件USERS02.DBF改为自动增长方式 SQL> alter database datafile 'C:\oracle\product\10.2.0\oradata\orcl\users02.dbf' autoextend on next 1m maxsize unlimited; Database altered 重新设置数据文件大小 SQL> alter database datafile 'C:\oracle\product\10.2.0\oradata\orcl\users02.dbf' resize 8m; Database altered 3.DB的开启(黑屏下) (1)SQL> startup nomount; ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1292036 bytes Variable Size 285214972 bytes Database Buffers 318767104 bytes Redo Buffers 7094272 bytes (2)SQL> alter database mount; 数据库已更改。 (3)SQL> alter database archivelog; 数据库已更改。 (4)SQL> archive log list; 数据库日志模式 存档模式 自动存档 启用 存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 25 下一个存档日志序列 27 当前日志序列 27 (5)SQL> alter database noarchivelog; 数据库已更改。 (6)SQL> alter database open; 数据库已更改。 DB的关闭(黑屏下) SQL> shutdown immediate; 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。
用来合并update和insert语句
通过merge语句,根据一张表(原数据表,source table)对另外一张(目标表,target table)表进行查询,连接条件匹配上的进行update,无法匹配的执行INSERT。
sqlplus / as sysdba sqlplus scott/tiger
create table KC ( kch VARCHAR2(3) not null, kcm VARCHAR2(16) not null, kkxq NUMBER(1) not null, xs NUMBER(2) not null, xf NUMBER(1) ) create table XS ( xh VARCHAR2(6), xm VARCHAR2(6), zym VARCHAR2(6), xb VARCHAR2(2), cssj DATE, zxf NUMBER(2), bz VARCHAR2(20) ) create table XS_KC ( xh CHAR(6) not null, kch CHAR(6) not null, cj INTEGER, xf NUMBER(2) ) insert into KC (kch, kcm, kkxq, xs, xf) values ('001', '001', 1, 11, 1); insert into KC (kch, kcm, kkxq, xs, xf) values ('001', '001', 1, 11, 1); insert into XS (xh, xm, zym, xb, cssj, zxf, bz) values ('061101', '王林', '计算机', '男', to_date('10-02-1986', 'dd-mm-yyyy'), 50, null); insert into XS (xh, xm, zym, xb, cssj, zxf, bz) values ('101112', '李明', '计算机', '男', to_date('30-01-1986', 'dd-mm-yyyy'), 36, null); insert into XS (xh, xm, zym, xb, cssj, zxf, bz) values ('001', '张琼', '计算机', null, null, 45, '三好学生'); insert into XS (xh, xm, zym, xb, cssj, zxf, bz) values ('121112', '王小二', '计算机', '男', to_date('30-01-1986', 'dd-mm-yyyy'), 36, null); insert into XS_KC (xh, kch, cj, xf) values ('061101', '101 ', 80, null); insert into XS_KC (xh, kch, cj, xf) values ('061101', '102 ', 78, null); insert into XS_KC (xh, kch, cj, xf) values ('061101', '206 ', 76, null); insert into XS_KC (xh, kch, cj, xf) values ('061103', '101 ', 82, null); insert into XS_KC (xh, kch, cj, xf) values ('061103', '102 ', 82, null); insert into XS_KC (xh, kch, cj, xf) values ('061103', '206 ', 83, null); insert into XS_KC (xh, kch, cj, xf) values ('061104', '101 ', 90, null); insert into XS_KC (xh, kch, cj, xf) values ('061107', '101 ', 98, null); insert into XS_KC (xh, kch, cj, xf) values ('061107', '102 ', 80, null); commit;
create table xs1 as select * from xs; insert into xs1(xh,xm,zym,xb,cssj,zxf) values('007','test','计算机','男',to_date('19900130','YYYYMMDD'),36) --使用MERGE语句XS_JSJ表中新增的数据插入表XS中: merge into xs a using xs1 b on(a.xh=b.xh) when not matched then insert(a.xh,a.xm,a.zym,a.xb,a.cssj,a.zxf) values(b.xh,b.xm,b.zym,b.xb,b.cssj,b.zxf);
create table PRODUCTS ( PRODUCT_ID INTEGER, PRODUCT_NAME VARCHAR2(60), CATEGORY VARCHAR2(60) ); create table NEWPRODUCTS ( PRODUCT_ID INTEGER, PRODUCT_NAME VARCHAR2(60), CATEGORY VARCHAR2(60) ); insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS'); insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS'); insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS'); insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS'); insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD'); commit; insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS'); insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS'); insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS'); insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS'); commit;
products为目标表,newproducts为源表,则若产品号相匹配,根据源表信息修改目标表的产品名(product_name)和产品类别(category)
merge into products p using newproducts np on (p.product_id = np.product_id) when matched then update set p.product_name=np.product_name, p.category=np.category;
若产品号不匹配,则根据源表将新的纪录添加到目标表
merge into products p using newproducts np on (p.product_id=np.product_id) when not matched then insert values(np.product_id,np.product_name,np.category);
增删改
merge into products p using newproducts np on (p.product_id=np.product_id) when matched then update set p.product_name= np.product_name, p.category = np.category delete where(p.category='ELECTRNCS') when not matched then insert values(np.product_id,np.product_name,np.category);
declare example_text varchar2(100); begin example_text:='本例为plsql示例程序块!!!'; dbms_output.put_line(example_text); exception when others then dbms_output.put_line('出现异常了!!!'); end;
declare v_xm varchar2(8):='Jame'; v_zym varchar2(10):='计算机'; v_zxf number(2):=55; begin update xs set zxf=v_zxf where xm=v_xm; if sql%notfound then dbms_output.put_line('没有该人,需要插入该人!!!'); insert into xs(xh,xm,zym,zxf) values('007',v_xm,v_zym,v_zxf); end if; end;
--禁用约束 alter table dept disable constraint deptno CASCADE alter table EMP disable constraint FK_DEPTNO; --启用约束 alter table dept enable constraint deptno alter table EMP enable constraint FK_DEPTNO; --查询约束具体状况 select * from user_constraints --用SCOTT用户执行,否则找不到 declare row_id rowid; info varchar2(100); begin update scott.dept set deptno=90 where dname='RESEARCH' returning rowid,dname || '::::' || to_char(deptno) into row_id,info; dbms_output.put_line('rowid:'||row_id); dbms_output.put_line(info); end; select t.*, t.rowid from DEPT t
declare row_id rowid; info varchar2(40); begin insert into scott.dept values(12,'财务室','海口') returning rowid,dname||'--->'||to_char(deptno) into row_id,info; dbms_output.put_line('rowid:'||row_id); dbms_output.put_line(info); end;
%TYPE - 引用变量和数据库列的数据类型
%ROWTYPE - 提供表示表中一行的记录类型
declare emp_number constant number(4):=7876; emp_name varchar2(10); emp_job varchar2(9); emp_sal number(7,2); begin select ename,job,sal into emp_name,emp_job,emp_sal from scott.emp where empno = emp_number; dbms_output.put_line('查询的员工号为'||'---->'||emp_number); dbms_output.put_line('该员工名为'||'---->'||emp_name); dbms_output.put_line('该员工职位为'||'---->'||emp_job); dbms_output.put_line('该员工工资为'||'---->'||emp_sal); end; 查询的员工号为---->7876 该员工名为---->ADAMS 该员工职位为---->CLERK 该员工工资为---->1100
declare emp_number number(4):=7876; emp_name scott.emp.ename%type; emp_job scott.emp.job%type; emp_sal scott.emp.sal%type; begin select ename,job,sal into emp_name,emp_job,emp_sal from scott.emp where empno = emp_number; dbms_output.put_line('查询的员工号为'||'---->'||emp_number); dbms_output.put_line('该员工名为'||'---->'||emp_name); dbms_output.put_line('该员工职位为'||'---->'||emp_job); dbms_output.put_line('该员工工资为'||'---->'||emp_sal); end;
declare v_1 number; begin select count(*) into v_1 from xs; dbms_output.put_line(v_1); exception when others then dbms_output.put_line('出现异常了!!!'); end;
declare one_emp scott.emp%rowtype; begin select * into one_emp from scott.emp where empno =7900; dbms_output.put_line('该员工职位为'||'---->'||one_emp.job); dbms_output.put_line('该员工工资为'||'---->'||one_emp.sal); end; 该员工职位为---->CLERK 该员工工资为---->950
变量名 数据表.列名%type
变量名 数据表%rowtype。
提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法
声明一个游标,读取学生的学号。
declare cursor my_cursor is select xh from xs; v_xh xs.xh%type; begin open my_cursor; fetch my_cursor into v_xh; dbms_output.put_line('学号:'||v_xh); dbms_output.put_line(my_cursor%rowcount); close my_cursor; exception when others then dbms_output.put_line(sqlcode||sqlerrm); end; 学号:061101 1
declare varid number; varname varchar2(50); cursor mycur(v_xb xs.xb%type) is select xh,xm from xs where xb=v_xb; begin open mycur('男'); fetch mycur into varid,varname; dbms_output.put_line('学生编号:'||varid||'学生姓名:'||varname); close mycur; end; 学生编号:61101学生姓名:王林
declare cursor c_1 is select * from xs; v_1 c_1%rowtype; begin open c_1; fetch c_1 into v_1; dbms_output.put_line('学号:'||v_1.xh||'姓名:'||v_1.xm||'总学分:'||v_1.zxf); fetch c_1 into v_1; dbms_output.put_line('当前游标指向第'||c_1%rowcount||'行'); close c_1; end; 学号:061101姓名:王林总学分:50 当前游标指向第2行
使用游标分别遍历xs表中的xh,zxf
declare v_xh varchar2(6); v_zxf number(2); cursor xs_cur3 is select xh,zxf from xs; begin open xs_cur3; fetch xs_cur3 into v_xh,v_zxf; while xs_cur3%found loop dbms_output.put_line('学号:'||v_xh||'总学分'||v_zxf); fetch xs_cur3 into v_xh,v_zxf; end loop; close xs_cur3; end; 学号:061101总学分50 学号:101112总学分36 学号:001总学分45 学号:121112总学分36 学号:007总学分36 学号:007总学分55
利用游标WHILE循环统计并输出scott.emp表各个部门的平均工资;若平均工资大于2000,则输出“该部门平均工资较高"
declare cursor c_dept_stat is select deptno,avg(sal) avgsal from scott.emp group by deptno; v_dept c_dept_stat%rowtype; begin open c_dept_stat; fetch c_dept_stat into v_dept; while c_dept_stat%found loop dbms_output.put_line('部门号:'||v_dept.deptno||'--'||'平均工资:'||trunc(v_dept.avgsal,1)); if(v_dept.avgsal >= 2000) then dbms_output.put_line(v_dept.deptno||'号部门工资较高'); end if; fetch c_dept_stat into v_dept; end loop; end; 部门号:30--平均工资:1566.6 部门号:20--平均工资:2175 20号部门工资较高 部门号:10--平均工资:2916.6 10号部门工资较高
利用FOR循环统计并输出各个部门的平均工资
declare cursor c_1 is select deptno,avg(sal) avgsal from scott.emp group by deptno; v_dept c_1%rowtype; begin for v_dept in c_1 loop dbms_output.put_line('部门号:'||v_dept.deptno||'--'||'平均工资:'||v_dept.avgsal); end loop; end; 部门号:30--平均工资:1566.666666666666666666666666666666666667 部门号:20--平均工资:2175 部门号:10--平均工资:2916.666666666666666666666666666666666667
Scott.emp表,利用游标,给工资低于1200 的员工增加工资50。并输出“编码为’员工编码号’的工资已经更新”。
declare v_empno scott.emp.empno%type; v_sal scott.emp.sal%type; cursor c_cursor is select empno,sal from scott.emp where sal <1200 for update; begin open c_cursor; loop fetch c_cursor into v_empno,v_sal; exit when c_cursor%notfound; update scott.emp set sal=sal+50 where current of c_cursor;-- 前面sal<1200 dbms_output.put_line('编码为'||v_empno||'工资已更新!!'); DBMS_output.put_line('记录数:'||c_cursor%rowcount); end loop; close c_cursor; end; 编码为7369工资已更新!! 记录数:1 编码为7876工资已更新!! 记录数:2 编码为7900工资已更新!! 记录数:3
修改scott.emp表员工的工资,如果员工的部门号为10,工资提高100;部门号为20,工资提高150;部门号为30,工资提高200;否则工资提高250。
declare cursor c_emp is select * from scott.emp for update; v_zl number; v_emp c_emp%rowtype; begin for v_emp in c_emp loop case v_emp.deptno when 10 then v_zl:=100; when 20 then v_zl:=150; when 30 then v_zl:=200; else v_zl:=250; end case; update scott.emp set sal= sal+v_zl where current of c_emp; end loop; end;
-- 增加一张表xs_1,用来存放从xs表中删除的记录 create table xs_1 as select * from xs; truncate table xs_1; create or replace trigger t1 before delete on xs for each now begin insert into xs_1(xh,xm,zym,xb,cssj,zxf) values(:old.xh,:old.xm,:old.zym,:old.xb,:old.cssj,:old.zxf); end t1; -- 监控用户对xs表的操作,要求:当xs表执行插入,更新和删除操作后在sql-info表中给出相应的提示和执行时间 Create table sql_info(info varchar2(10),time date); create or replace trigger t2 after delete or insert or update on xs for each row declare v_info sql_info.info%type; begin if deleting then v_info:='删除'; elsif inserting then v_info:='插入'; else v_info:='更新'; end if; insert into sql_info values(v_info,sysdate); end t2; --当插入新员工时显示新员工的员工号、员工名;当更新员工工资时,显示修改前后员工工资;当删除员工时,显示被删除的员工号、员工名 create or replace trigger t3 before insert or update or delete on scott.emp for each row begin if inserting then dbms_output.put_line(:new.empno||'---->'||:new.ename); elsif updating then dbms_output.put_line(:old.sal||'----->'||:new.sal); else dbms_output.put_line(:old.empno||'----->'||:old.ename); end if; end t3 --触发t3 Set serveroutput on declare begin update scott.emp set empno=7521 where empno=7522; commit; end; --针对Scott.emp表,记录其相应操作的信息,具体如下: --当执行插入操作时,统计操作后员工人数; --当执行更新工资操作时,统计更新后员工平均工资; --当执行删除操作时,统计删除后各个部门剩余的人数(游标)。 create or replace trigger t4 after insert or update or delete on scott.emp declare v_1 number; v_2 scott.emp.sal%type; begin if inserting then select count(*) into v_1 from scott.emp; dbms_output.put_line('添加成员后的总人数:'||'---->'||v_1); elsif updating then select avg(sal) into v_2 from scott.emp; dbms_output.put_line('更新记录后平均工资:'||'----->'||v_2); else for v_s in (select deptno, count(*) num from scott.emp group by deptno) loop dbms_output.put_line('删除记录后各个部门的部门号和总人数:'||v_s.deptno||'<---->'||v_s.num); end loop; end if; end t4; delete from scott.emp where hiredate<=to_date('1980-12-17','yyyy-mm-dd'); update scott.emp set empno=1111 where empno=7934; Select to_char(sysdate,'yyyy-MM-dd HH24:mi') from dual; Select to_char(sysdate, 'DAY') from dual; -- 建一触发器,作用为禁止在休息日(周六、周天)改变scott.emp雇员信息(包括添加删除和修改)。 create or replace trigger t6 before insert or update or delete on scott.emp begin if to_char(sysdate,'day') in ('星期五') then raise_application_error(-20222,'不能在星期三修改员工信息'); end if; end; update scott.emp set ename='candy' where empno=7876;