--------- --------- ------------------------------ ---------------- 1 1 ZHAOYUANJIE 2 1 ZHAOYUANJIE 3 1 ZHAOYUANJIE 4 1 ZHAOYUANJIE 5 1 ZHAOYUANJIE 6 1 ZHAOYUANJIE 7 833 8 833
11 370 SYS ZHAOYUANJIE 13 370 SCOTT ZHAOYUANJIE 10 rows selected.
SQL> alter system kill session '&sid,&ser'; Enter value for sid: 13 Enter value for ser: 370
old 1: alter system kill session '&sid,&ser' new 1: alter system kill session '13,370' System altered. real: 100 216
10.2.4 用TRANSLATE 对数据加密和解密
TRANSLATE 函数是一个变换函数,用它可以实现对存入表中数据进行加密和解密处理。函 数语法如下:
REPLACE (‘string’ [,’string_in’,’string_out’])
String:希望被替换的字符串或变量。 String_in: 被替换字符串。 String_out: 要替换字符串。 例1: PL/SQL
Var1:= REPLACE (‘Oracle’, ‘Or’, ‘Mir’,); SQL
SELECT REPLACE (‘Oracle’, ‘Or’, ‘Mir’) “Example “ FROM DUAL; Example ------- Miracle
下面给出较复杂的例子,例1 是一个加密的存储过程,例2 是用该过程进行加密的过程;例 3 是密的过程,例4 是使用解密的过程: 例 1:加密过程可以写成如下:
CREATE OR REPLACE FUNCTION ENCRYPT(INPASS IN VARCHAR2) RETURN VARCHAR2 AS STRING_IN VARCHAR(78); STRING_OUT VARCHAR2(39); OFFSET NUMBER(2); OUTPASS VARCHAR2(30); BEGIN
OFFSET := TO_NUMBER(TO_CHAR(SYSDATE,’SS’))MOD 39; STRING_IN := ‘YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_’; STRING_OUT :=’_$#ABCDEFGHIJKMNOPQRSTUVWXYZ0123456789’;
OUTPASS := SUBSTR(STRING_IN,OFFSET,1); STRING_IN := STRING_IN||STRING_IN; STRING_IN := SUBSTR(STRING_IN,OFFSET,39);
OUTPASS := OUTPASS||TRANSATE(UPPER(INPASS),STRING_IN,STRING_OUT); RETURN OUTPASS; END;
例 2:编写下面过程以调用ENCRYPT 来加密: DECLARE 217
X VARCHAR2(40); BEGIN
X := ENCRYPT(‘HELLO’);
DBMS_OUTPUT.PUT_LINE(‘Encrypted:’|| X ); END;
SQL>set serveroutput on SQL>/
Encrypted:#2PVV9
例 3:编写一个针对例1 的加密函数程序:
CREATE OR REPLACE FUNCTION DECRYPT(OUTPASS IN VARCHAR2) RETURN VARCHAR2 AS STRING-IN VARCHAR2(780; STRING_OUT VARCHAR2(39); OFFSET NUMBER(2); INPASS VARCHAR2(30);
BEGIN
STRING_IN :=‘YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_’; STRING_OUT :=’_$#ABCDEFGHIJKMNOPQRSTUVWXYZ0123456789’; OFFSET := INSTR(STRING_IN,SUBSTR(OUTPASS,1,1)); STRING_IN := STRING_IN||STRING_IN; STRING-IN := SUBSTR(STRING_IN,OFFSET,39);
INPASS := TRANSLATE(UPPER(SUBSTR(OUTPASS,2)),STRING_OUT,STRING_IN); RETURN INPASS; END;
例 4:编写一个调用解密的简单过程: DECLARE X VARCHAR2(30); BEGIN
X := DECRYPT(‘#2PVV9’); DBMS_OUTPUT.PUT_LINE(X); END;
10.2.5 如何用查询来修改数据
有时需要用另外表的数据或本表的数据来修改某些记录。这样的应用在实际中经常使用。 以下例子具有代表性: 例 1:更新一个字段的情况:
UPDATE DEPT SET DEPT_NAME=(SELECT DEPART_NAME FROM DEPART 218
WHERE DEPART.DEPTNO = DEPT.DEPTNO ); 例 2:更新多个字段的情况:
UPDATE CHP8A
SET (DEPT_NAME,MGR_ID)=(SELECT DEPART_NAME,MANAGER_ID FROM CHP8B WHERE CHP8B.DEPART_NUMBER=CHP8A.DEPT_NO AND ROWNUM=1)
WHERE EXIST(SELECT ‘X’ FROM CHP8B where CHP8B.depart_number=CHP8a.dept_no); 10.2.6 如何产生创建用户的脚本
有时,我们需要在新的环境创建用户,这些用户来自一个已经存在的应用环境中。比如希望重 新创建用户的命令如何来产生。下面的例子从数据字典中查询数据自动完成创建用户、创建 角色、授权角色给用户操作。
accept uname prompt '输入希望的用户名: ' spool c:\\gen_user
SELECT username, 'CREATE USER '||username||' '|| DECODE(password, 'EXTERNAL', 'IDENTIFIED EXTERNALLY', 'IDENTIFIED BY '''||password||''' ') lne, 'DEFAULT TABLESPACE '||default_tablespacelne,
'TEMPORARY TABLESPACE '||temporary_tablespace||';' lne FROM DBA_USERS
WHERE USERNAME LIKE UPPER('%&&uname%') OR UPPER('&&uname') IS NULL ORDER BY USERNAME;
SELECT username, 'ALTER USER '||username||' QUOTA '||
DECODE(MAX_BYTES, -1, 'UNLIMITED', TO_CHAR(ROUND(MAX_BYTES/1024))||'K') ||' ON TABLESPACE '||tablespace_name||';' lne