欢迎投稿

今日深度:

Oracle备忘录1,oracle备忘录

Oracle备忘录1,oracle备忘录


数据库管理员:
安装升级Oracle数据库
建库,表空间,表,视图,索引。。。
制定并实施备份和修复计划
数据库权限管理,调优,故障排除
对于高级DBA,要求参与项目开发,会编写SQL语句,存储过程,触发器,规则,约束,包

CREATE TABLE EMP
(
EMPNO NUMBER(4) PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(4)
);

CREATE TABLE DEPT(
DEPTNO NUMBER(4),
DNAME VARCHAR2(14),
LOC VARCHAR2(13)
);

CREATE TABLE SALGRADE
(
GRADE NUMBER,
LOSAL  NUMBER,
HISAL NUMBER 
);

CREATE TABLE BONUS
(
ENAME VARCHAR(10),
JOB VARCHAR2(9),
SAL NUMBER,
COMM NUMBER
);

INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');

INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,TO_DATE('17-12-1980','dd-mm-yyyy'),800,null,20);   
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,TO_DATE('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,TO_DATE('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,TO_DATE('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,TO_DATE('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,TO_DATE('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,TO_DATE('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,TO_DATE('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP
VALUES(7788,'SCOTT','ANALYST',7566,'19-4月-1987',3000.00,NULL,20);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,TO_DATE('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,TO_DATE('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,TO_DATE('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,TO_DATE('23-1-1982','dd-mm-yyyy'),1300,NULL,10);

INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);


SELECT * FROM DEPT;
SELECT * FROM EMP;
SELECT * FROM SALGRADE;

CREATE USER  DB_USER IDENTIFIED BY DB_USER_PW;   ——创建数据库/用户,要在system下进行操作
DROP USER  DB_USER (CASCADE);
passw;   ——修改用户密码 
passw DB_USER;    ——管理员修改用户密码
ALTER USER  DB_USER IDENTIFIED BY DB_USER_PW;   ——管理员修改用户密码
shutdown;
startup;
SHOW parameter;

赋予权限:前两个要在system下进行操作
方法1:GRANT DBA TO DB_USER;       ——赋予用户数据库管理权限
方法2:GRANT CONNECT TO DB_USER;       ——赋予用户连接权限
       GRANT RESOURCE TO DB_USER;         ——赋予用户资源权限
方法3:CONNECT DB_USER/DB_USER_PW as sysdba或者as sysoper;   ——连接数据库并赋予权限
GRANT CREATE SESSION TO DB_USER;    ——赋予用户创建会话的权限,对Oracle数据库暂时不知道怎么用

CREATE USER  role NOT IDENTIFIED; ——创建角色时不需要输入密码即可登录 
显示数据库中所有的用户:
SELECT USER NAME FROM dba_USER s;
显示数据库中用户的系统权限:
SELECT * FROM dba_sys_privs WHERE GRANTee='角色名;
SELECT * FROM role_sys_privs WHERE role='角色名;
显示数据库中用户的对象权限:
SELECT * FROM dba_tab_privs WHERE GRANTee='角色名';    
显示数据库中用户的角色:
SELECT * FROM dba_role_privs WHERE GRANTee='用户名';
显示数据库中用户的权限
SELECT * FROM dba_sys_privs 
Oracle究竟有多少中角色
SELECT * FROM dba_roles;
Oracle的所有系统权限
SELECT * FROM system_privilege_map order BY NAME;
Oracle的所有对象权限
SELECT DISTINCT privilege FROM dba_tab_privs;

显示当前数据库的全称:
SELECT * FROM global_NAME;

conn sys/change_on_install as sysdba;——作为系统数据库管理员登录

DROP TABLE r;       ——删除表
RENAME r TO r1;   ——重命名表名

ALTER TABLE r RENAME column A1 TO A2;    ——修改表中的列名
ALTER TABLE r ADD A D;     ——增加列的属性
ALTER TABLE r MODIFY A D;     ——修改列的属性
ALTER TABLE r DROP A;        ——删除列的属性

INSERT INTO r VALUES();          ——插入元组(表中内容)
UPDATE TABLE r SET A WHERE ...;  ——更新元组(表中内容)

DELETE FROM r WHERE ...;  ——删除元组(表中内容),写日志,可恢复
TRUNCATE TABLE r;__删除元组(表中内容),速度快,不写日志,不可恢复

SHOW linesize;  ——显示行的宽度,默认值为80
SET linesize NUMBER; ——设置行的宽度为NUMBER    
SET pagesize NUMBER;  ——设置每页显示的行数,默认值为14

ALTER SESSION SET nls_date_format='yyyy-mm-dd'; __日期设置成中国人习惯的方式
NVL(D,0)  ——如何处理空值null


--增加约束
ALTER TABLE r MODIFY A NOT NULL;--非空
ALTER TABLE r ADD CONSTRAINT cardunique UNIQUE(A); --身份证唯一
ALTER TABLE r ADD CONSTRAINT ADDresscheck CHECK(A in('北京','上海','广州'));
--删除约束
ALTER TABLE r DROP CONSTRAINT A UNIQUE/CHECK;
ALTER TABLE r DROP CONSTRAINT primary key CASCADE;

UPDATE  r SET A WHERE ...;  ——更新元组(表中内容)
UPDATE  r SET (a1,a2,a3)=(SELECT (A1,A2,A3) FROM r WHERE...) WHERE...;
DELETE FROM r WHERE ...;  ——删除元组(表中内容)

显示当前用户下的所有表:
SELECT TABLE_NAME FROM USER _TABLEs;
显示当前用户可以访问的所有的表:
SELECT TABLE_NAME FROM all_TABLEs;
显示数据库中全部的表,必须是dba或者具有SELECT any TABLE的权限
SELECT TABLE_NAME FROM dba_TABLEs;

CREATE profile failed_login_lock_NAME limit failed_login_attEMPs num1 password_lock_time num2;   ——建立输入密码错误次数达到num1时锁定规定时间num2
CREATE profile password_life_time_NAME limit password_life_time num1 password_grace_time num2 password_reuse_time NUMBER3;  ——建立在num1修改密码,宽限天为num2,在NUMBER3天后可以重用
DROP profile profile_NAME(CASCADE);    ——删除文件
ALTER USER  DB_USER profile profile_NAME;     ——对某用户实行这一锁定规则 
ALTER USER  DB_USER account unclok;  ——进行解锁 

savapoint a;——设置回滚点,保存点,可预防数据库重要信息的丢失,保存点个数没有限制(可以设置多个回滚点)
ROLLBACK TO a;——回滚到这个点
ROLLBACK;——回滚到最初的状态
COMMIT;——提交,每天都必须的操作,但是会删除全部保存点,释放锁,谨慎使用,使用时确保数据库已经不存在问题!

分页:
ROWNUM
经典例句:SELECT * FROM (SELECT a.*,rownum rn FROM (SELECT * FROM EMP) a WHERE rownum<=10)  WHERE rn>=6;
复制一部分:CREATE TABLE myTABLE(id,NAME) as SELECT EMPno,ename FROM EMP;

UNION 合并查询去重 UNION ALL  不去重
INTERSECT 交集查询
MINUS  差集查询,前面减去两者的交集
TO_DATE('1991-12-12','yyyy-mm-dd')     TO_DATE('1991/12/12','yyyy/mm/dd') ——指定日期格式
INSERT INTO EMP VALUES(1235,'Test_2','MANAGER',7782,TO_DATE('1998-9-9 12:10:10','yyyy-mm-dd hh24:mi:ss'),1000,100,10);
INSERT INTO EMP VALUES(1236,'Test_3','MANAGER',7782,sysdate,1000,100,10);
SELECT ename,TO_CHAR(hiredate,'yyyy-mm-dd hh24:mi:ss') FROM EMP; ——查询具体时间,小时,分钟,秒,bbs系统常备
SELECT ename,TO_CHAR(hiredate,'yyyy-mm-dd hh24:mi:ss'),TO_CHAR(sal,'L99,999.99') FROM EMP;  ——显示本地货币
SELECT * FROM EMP WHERE TO_CHAR(hiredate,'yyyy')=1980;  ——显示某一年入职的员工,某一月mm,某一年中的某一月同理yyyy-mm

SET TRANSLATE READ ONLY; ——事务处理集

函数:
LOWER(A);
UPPER(A);
LENGTH(A);
SUBSTR(A,m,n); ——m代表起始位置,n代表取得字符个数
完成首字母大写 ——SELECT UPPER(SUBSTR(A,1,1)) FROM EMP;
完成后面字母小写——SELECT lower(SUBSTR(A,2,LENGTH(A)-1)) FROM r;
合并:SELECT UPPER(SUBSTR(A,1,1))||lower(SUBSTR(A,2,LENGTH(A)-1)) FROM r;
REPLACE(A,search_string,REPLACE_string); ——替换字符
INSTR(char1,char2,[,n[,m]]; ——取字串在字符串的位置

数学函数:
ROUND(A,m); ——四舍五入,保留m位
TRUNC(A,m);——截取数字,保留m位,忽略余数
MOD(A,n);——对A取模n
FLOOR(A);——返回小于或者等于n的最大整数,忽略余数
CEIL(A);——返回大于或者等于n的最小整数

SELECT SYSDATE FROM dual;——返回系统时间
SELECT * FROM EMP WHERE sysdate>ADD_months(hiredate,8);返回系统时间8个月之前的员工
SELECT trunc(sysdate-hiredate) "入职天数" FROM EMP;      ——返回入职天数
SELECT hiredate,ename FROM EMP WHERE last_day(hiredate)-2=hiredate;  ——返回每月倒数第2天的员工

转换函数:
TO_CHAR(A,'');   
TO_DATE(A,'');

系统函数:
SELECT sys_context('USER env','db_NAME') FROM dual;               ——language:当前语言,SESSION_USER :当前用户,current_schema:当前方案

进行行迁移:
INSERT INTO r2(A1,A2,A3) SELECT a1,a2,a3 FROM r1 WHERE ...;

导出:
导出表,导出方案,导出数据库
EXP命令,要从命令行进入oracle中的bin 目录
USER id,TABLEs,owner,full=y,inctype,rows,file
导出表的结构而不导入数据:
EXP USER id=learning/123456@XE TABLEs=(EMP) file=E:\DeskTop\EMP.dmp rows=n
导出表:
EXP USER id=learning/123456@XE TABLEs=(EMP) file=E:\DeskTop\EMP.dmp
下面这种方式导出快
EXP USER id=learning/123456@XE TABLEs=(EMP) file=E:\DeskTop\EMP.dmp direct=y
导出方案:
EXP USER id=learning/123456@XE owner=learning file=E:\DeskTop\EMP.dmp
导出全部:
EXP USER id=system/123456@XE full=y inctype=complete file=E:\DeskTop\EMP.dmp
导入表的结构,而不导入表的数据:
IMP USER id=learning/123456@XE TABLEs=(EMP) file=E:\DeskTop\EMP.dmp rows=n
导入表:
IMP USER id=learning/123456@XE TABLEs=(EMP) file=E:\DeskTop\EMP.dmp
导入数据,如果表已经存在只导入数据:
IMP USER id=learning/123456@XE TABLEs=(EMP) file=E:\DeskTop\EMP.dmp ignore y
导入表到其他用户
IMP USER id=system/123456@XE TABLE=EMP file=E:\DeskTop\EMP.dmp TOUSER =learning;
导入数据库:
IMP USER id=system/123456@XE full=y file=E:\DeskTop\EMP.dmp TOUSER =learning;

建立表空间:
CREATE TABLESPACE data01 datafile 'E:\data01.dbf' size 20m uniform size 128k;
增加数据文件:
ALTER TABLESPACE data01 ADD datafile 'E:\data02.dbf' size 20m;
增加数据文件的大小:
ALTER TABLESPACE data01 'E:\data01.dbf' resize 20m;
设置文件的自动增长:
ALTER TABLESPACE data01 'E:\data01.dbf' auTOextEND on next 10m maxsize 500m;

磁盘损坏时的做法:
确定数据文件所在的表空间:
SELECT TABLESPACE_NAME FROM dba_data_files WHERE file_NAME='E:\data01.dbf'; 
使表空间脱机:
ALTER TABLESPACE data01 offline;
移动表空间:
host move E:\data01.dbf D:\data01.dbf
对数据库文件进行逻辑修改:
ALTER TABLESPACE data01 RENAME datafile 'E:\data01.dbf TO D:\data01.dbf';
使得表空间联机:
ALTER TABLESPACE data01 online;

使用数据库表空间:
CREATE TABLE r(deptno NUMBER(4),dNAME varchar2(14),loc varchar2(13)) TABLESPACE data01;
查询表空间中的表:
 SELECT * FROM all_TABLEs WHERE TABLESPACE_NAME='DATA01';//注意大写
查询表处于哪个表空间:
SELECT TABLESPACE_NAME,TABLE_NAME FROM USER _TABLEs WHERE TABLE_NAME='EMP'; //注意大写
删除表空间:
DROP TABLESPACE DATA01 including contents and datafiles;

表级定义:
在定义了列之后添加约束
列级定义:
在定义列的同时添加约束

创建一个存储过程,该过程可以向某表中添加记录
CREATE TABLE mytest(
name VARCHAR2(30),
password VARCHAR2(30)
);
CREATE OR REPLACE  PROCEDURE b IS
BEGIN
--执行部分
INSERT INTO mytest VALUES('jack','123456');
END;
/
CREATE OR REPLACE  PROCEDURE b IS
BEGIN
--执行部分
DELETE FROM mytest WHERE name='jack';
END;
/
REPLACE表示如果有相同的过程名就替换,b表示过程名
查看错误信息:
SHOW error;
如何调用该过程
1:EXEC 过程名(参数值1,参数值2);
2:CALL 过程名(参数值1,参数值2);
定义常量时,建议用v_作为前缀v_sal
定义常量时,建议用c_作为前缀c_rate
当定义游标时,建议用_cursor作为后缀EMP_cursor
当定义例外时,建议用e_作为前缀e_error

SET serveroutput ON;--开启显示内容  
SET serveroutput OFF--关闭显示内容

BEGIN
DBMS_OUTPUT.PUT_LINE('helloworld');
	END; 
	/--这个最后在加上

--显示雇员名,薪水
DECLARE
v_ename VARCHAR2(5);
v_sal NUMBER(7,2);
BEGIN 
SELECT ename,sal INTO v_ename,v_sal FROM EMP WHERE EMPno=&no;
--输出
DBMS_OUTPUT.PUT_LINE('雇员是:'||v_ename||',他的薪水是:'||v_sal);
--异常处理
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('输入有误,请重新输入!');
END;
/

案例
CREATE PROCEDURE a1(a1name VARCHAR2,a1sal NUMBER) IS
BEGIN
--执行,根据故原名修改工资
UPDATE EMP SET sal=a1sal WHERE ename=a1name; 
END;
/
EXEC a1('SCOTT',150);--这样SCOTT的工资就被修改成了150

--采用function来查询某个雇员的工资
CREATE FUNCTION fj_fun1(fjname VARCHAR2) 
RETURN NUMBER IS yearsal NUMBER(7,2);
BEGIN
--执行部分
SELECT sal*12+NVL(comm,0)*12 INTO yearsal FROM EMP WHERE ename=fjname;
RETURN yearsal;
END;
/
--调用
VAR abc NUMBER;
CALL  fj_fun1('SCOTT') INTO:abc;

--创建包。声明该包有一个过程update_sal,声明该包有一个函数annual_income:
CREATE PACKAGE fj_package IS
PROCEDURE update_sal(name VARCHAR2,newsal NUMBER);
FUNCTION annual_income(name VARCHAR2) return NUMBER;
END;
/
--给包sp_package实现包体 ,来修改某个雇员的工资或者查询某个雇员的工资
CREATE OR REPLACE PACKAGE BODY fj_package IS 
PROCEDURE update_sal(name VARCHAR2, newsal NUMBER) IS 
BEGIN 
UPDATE EMP SET sal = newsal WHERE ename = name; 
END; 
FUNCTION annual_income(name VARCHAR2) RETURN NUMBER IS 
annual_salary NUMBER; 
BEGIN 
SELECT sal * 12 + NVL(comm, 0) INTO annual_salary FROM EMP WHERE ename = name; 
RETURN annual_salary; 
END; 
END; 
/ 
--调用
CALL fj_package.update_sal('SCOTT', 1400);

--输入员工号,显示雇员姓名、工资、个人所得税,税率为0.03为例
DECLARE 
c_tax_rate NUMBER(3,2):=0.03;
v_name VARCHAR2(5);--EMP.ename%TYPE
v_sal NUMBER(7,2);--EMP.sal%TYPE
v_tax_sal NUMBER(7,2);
BEGIN
--执行
SELECT ename,sal INTO v_name,v_sal FROM EMP WHERE EMPno=&no;
--计算个人所得税
v_tax_sal:=v_sal*c_tax_rate;--注意冒号
--输出
DBMS_OUTPUT.PUT_LINE('雇员是:'||v_name||',工资是:'||v_sal||',需要交的个人所得税是:'||v_tax_sal);
END;
/

--类似于高级语言中的结构体
--PL/SQL记录实例
DECLARE 
--表示要定义一个PL/SQL记录类型 EMP_record_type,类型包含name,salary,title
TYPE EMP_record_type IS RECORD(
name EMP.ename%TYPE,
salary EMP.sal%TYPE,
title EMP.job%TYPE
);
--定义了一个变量,这个变量的类型是EMP_record_type
fj_record EMP_record_type;--v_name VARCHAR2(45);
BEGIN
SELECT ename,sal,job INTO fj_record FROM EMP WHERE EMPno=7788;
DBMS_OUTPUT.PUT_LINE('员工名:'||fj_record.name||',工资是:'||fj_record.salary);
END;
/

--相当于高级语言中的数组
DECLARE
--定义了一个PL/SLQL表类型,该类型是用于存放EMP.ename%TYPE
TYPE fj_TABLE_type IS TABLE OF EMP.ename%TYPE
INDEX BY BINARY_INTEGER;--代表下标是按整数排序的,可以为负数
fj_TABLE fj_TABLE_type;
BEGIN 
SELECT ename INTO fj_TABLE(0) FROM EMP WHERE EMPno=7788;
DBMS_OUTPUT.PUT_LINE('员工名:'||fj_TABLE(0));--下标跟上面的下标一样
END;
/

DECLARE
--定义了一个PL/SLQL表类型,该类型是用于存放EMP.ename%TYPE
TYPE fj_TABLE_type IS TABLE OF EMP.ename%TYPE
INDEX BY BINARY_INTEGER;--代表下标是按整数排序的,可以为负数
fj_TABLE fj_TABLE_type;
BEGIN 
SELECT ename INTO fj_TABLE(0) FROM EMP;
DBMS_OUTPUT.PUT_LINE('员工名:'||fj_TABLE(0));--下标跟上面的下标一样
END;
/

--输入部门号,显示该部门所有员工姓名和他的工资
DECLARE 
--定义游标类型fj_EMP_cursor
TYPE fj_EMP_cursor IS REF CURSOR;
--定义游标变量
test_cursor fj_EMP_cursor;
--定义变量
v_ename EMP.ename%TYPE;
v_sal EMP.sal%TYPE;
BEGIN
--执行
--把test_cursor和一个SELECT结合
OPEN test_cursor FOR SELECT ename,sal FROM EMP WHERE deptno=&no;
--循环取出
LOOP
FETCH test_cursor INTO v_ename,v_sal;
--判断是否test_cursor是否为空
EXIT WHEN test_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('雇员名是:'||v_ename||',薪水'||v_sal);
END LOOP;
END;
/


--在上面的基础上,如果某个雇员的工资低于200元,就增加100元
DECLARE 
--定义游标类型fj_EMP_cursor
TYPE fj_EMP_cursor IS REF CURSOR;
--定义游标变量
test_cursor fj_EMP_cursor;
--定义变量
v_ename EMP.ename%TYPE;
v_sal EMP.sal%TYPE;
BEGIN
--执行
--把test_cursor和一个SELECT结合
OPEN test_cursor FOR SELECT ename,sal FROM EMP WHERE deptno=&no;
--循环取出
LOOP
FETCH test_cursor INTO v_ename,v_sal;
--判断工资高低,决定是否更新
--判断是否test_cursor是否为空
EXIT WHEN test_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('雇员名是:'||v_ename||',薪水'||v_sal);
END LOOP;
END;
/	

--编写一个过程,输入雇员名,工资低于2000的雇员工资增加10%
CREATE OR REPLACE PROCEDURE fj_pro6(fjname VARCHAR2) IS
--定义
v_sal EMP.sal%TYPE;
BEGIN
--执行
SELECT sal INTO v_sal FROM EMP WHERE ename=fjname;
--判断
IF v_sal<2000 THEN
UPDATE EMP SET sal=sal*1.1 WHERE ename=fjname;
END IF;
END;
/
--调用
EXEC fj_pro6('SCOTT');

--雇员如果补助为零则加200,如果不为零则加100
CREATE OR REPLACE PROCEDURE fj_pro7(fjname VARCHAR2) IS
--定义
v_comm EMP.comm%TYPE;
BEGIN
--执行
SELECT comm INTO v_comm FROM EMP WHERE ename=fjname;
--判断
IF v_comm<>0 THEN
UPDATE EMP SET comm=comm+100 WHERE ename=fjname;
ELSE 
UPDATE EMP SET comm=comm+200 WHERE ename=fjname;
END IF;
END;
/
--调用
EXEC fj_pro7('SCOTT');

--三个条件分支 IF-THEN-ELSEIF-ELSE
--输入雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER就给他的工资增加500,其它职位的雇员工资增加200。 
CREATE OR REPLACE PROCEDURE fj_pro8(fjno NUMBER) IS
--定义
v_job EMP.job%TYPE;
BEGIN
--执行
SELECT job INTO v_job FROM EMP WHERE EMPno=fjno;
IF v_job='PRESIDENT' THEN
UPDATE EMP SET sal=sal+1000 WHERE EMPno=fjno;
ELSIF v_job='MANAGER' THEN
UPDATE EMP SET sal=sal+500 WHERE EMPno=fjno;
ELSE
UPDATE EMP SET sal=sal+200 WHERE EMPno=fjno;
END IF;
END;
/
--调用
EXEC fj_pro8(7839);

--循环语句 LOOP
--users表中,用户编号从1开始增加
CREATE TABLE users(
userno NUMBER,
username VARCHAR2(40)
);
CREATE OR REPLACE PROCEDURE fj_pro9(fjname VARCHAR2) IS
--定义:=表示赋值
v_num NUMBER:=1;
BEGIN
LOOP
INSERT INTO users VALUES(v_num,fjname);
--判断退出条件
EXIT WHEN v_num=10;
--自增
v_num:=v_num+1;
END LOOP;
END;
/
--调用
EXEC fj_pro9('root1');
--这样表中会有十个username为root1的元组

CREATE OR REPLACE PROCEDURE fj_pro10(fjname VARCHAR2) IS
--定义:=表示赋值
v_num NUMBER:=11;
BEGIN
WHILE v_num<=20 LOOP
INSERT INTO users VALUES(v_num,fjname);
v_num:=v_num+1;
END LOOP;
END;
/
--调用
EXEC fj_pro10('root1');

www.htsjk.Com true http://www.htsjk.com/shujukunews/7905.html NewsArticle Oracle备忘录1,oracle备忘录 数据库管理员:安装升级Oracle数据库建库,表空间,表,视图,索引。。。制定并实施备份和修复计划数据库权限管理,调优,故障排除对于高级DBA,要求参...
评论暂时关闭