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');
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。