Oracle数据库分页(一)

准备工作       
         1.设置时间显示样式
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
       
         2.创建表(T_USERS)
drop table T_USERS;
CREATE  table  T_USERS (
		hs_uuid number(20) primary key,
		hs_login varchar(50) not null unique,
		hs_nick_name varchar(200),
		hs_creator varchar(50) default 'luchunli',
		hs_created_time Date,
		hs_modifider varchar(50) default 'luchunli',
		hs_sex varchar(10),
		hs_password varchar(50),
		constraint T_USERS_CHECK_CONS check(hs_sex in ('male', 'female'))
);

         3.创建序列,实现主键自增
drop sequence T_USERS_SEQ;
CREATE sequence T_USERS_SEQ
	start with        1
	increment by   1
	nomaxvalue
	nominvalue
	nocache
	;

         4.创建触发器,每次添加数据时主键自增
CREATE or REPLACE trigger T_USERS_TR
		before insert on T_USERS
		for each row
		begin
			SELECT T_USERS_SEQ.nextval into :new.hs_uuid from dual;
		end;
		/

          5.创建函数来加密密码
CREATE or REPLACE function T_USERS_ENCODE_PWD (
		str_pwd in varchar
		)
		return VARCHAR
		as
		raw_pwd RAW(128);
		encode_pwd RAW(128);
	begin
		raw_pwd := UTL_RAW.cast_to_raw(str_pwd);
		DBMS_OBFUSCATION_TOOLKIT.MD5(input => raw_pwd, checksum => encode_pwd);
		return LOWER(RAWTOHEX(encode_pwd));
	end T_USERS_ENCODE_PWD;
	/

          测试加密函数
SQL> select T_USERS_ENCODE_PWD('luchunli') from dual;
-- 直接通过SELECT测试
T_USERS_ENCODE_PWD('LUCHUNLI')
------------------------------------------------------
edd2c9015c11a0cf2df6a1b5681a374a
-- 通过PL/SQL块测试	
set serveroutput on	
DECLARE
       v_input_pwd VARCHAR2(100):= 'luchunli';
       v_pwd VARCHAR2(100);   
BEGIN
       v_pwd := T_USERS_ENCODE_PWD(v_input_pwd);
       DBMS_OUTPUT.put_line(v_pwd);
END;
/

          6.创建存储过程来插入测试数据
CREATE or REPLACE procedure T_USERS_PROC (
			login		in 		T_USERS.hs_login%type,
			nick_name	in 		T_USERS.hs_nick_name%type,
			creator		in		T_USERS.hs_creator%type,
			modifider	in		T_USERS.hs_modifider%type,
			password	in		T_USERS.hs_password%type
		)
		as
		t_start number := 1;
		t_total number := 1000;
		t_sex varchar(10) := 'male';
		hs_encode_pwd varchar(50);
		-- temp number := 0;
	begin
		hs_encode_pwd := T_USERS_ENCODE_PWD(password);		
		DBMS_OUTPUT.put_line('原来密码:'||password||',加密后的密码:'||hs_encode_pwd);
		while t_start < t_total loop
		/**
                -- 不明白的地方
		select floor(dbms_random.value(1,10)) into temp from dual;
		if (temp mod 2) = 0 then
		t_sex := 'male';
		else
		t_sex := 'famale';
		end if;
		*/
		INSERT INTO t_users(hs_login, hs_nick_name, hs_creator, hs_created_time, hs_modifider, hs_sex, hs_password) values (login||t_start, nick_name, creator, to_date('2011-10-11', 'yyyy-mm-dd'), modifider, 'male', hs_encode_pwd);
		-- 在上面的插入语句中,如果将'male'替换成我上面计算出来的t_sex将报错check constraint (SYSTEM.T_USERS_CHECK_CONS) violated
		t_start := t_start + 1;	
		end loop;
	end T_USERS_PROC;
	/

            7.通过PL/SQL块来调用存储过程
/**
-- 可以接受外部输入,当调用存储过程时将其作为参数传入
accept  login		prompt"请输入登录名:"
accept  nick_name	prompt"请输入昵称:"
accept  creator		prompt"请输入创建者:"
accept  modifider	prompt"请输入修改者:"
accept  password		prompt"请输入密码:"
*/
declare 
/**
-- 获取接收的参数的值
	hs_login		T_USERS.hs_login%type := '&login';
	hs_nick_name	T_USERS.hs_nick_name%type := '&nick_name';
	hs_creator		T_USERS.hs_creator%type := '&creator';
	hs_modifider	T_USERS.hs_modifider%type := '&modifider';
	hs_password		T_USERS.hs_password%type := '&password';
*/
begin	
	-- 我这里用来测试,给予了特定的值
	T_USERS_PROC('admin', 'Lcr Admin', 'luchunli', 'cr', 'luchunli');
	commit;
end ;
/

       总结:
       1.在创建触发器和函数时提示"created with compilation errors",使用"show errors;"查看详细错误信息。
       2.RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。
       3.Oracle中获得随机数.select dbms_random.value from dual;可以获取0到1之间的随机数;select round(dbms_random.value,3) from dual;保留小数位数为3位的随机数;select floor(dbms_random.value(30,50)) from dual;这样就可以取得到30到50之间的随机整数。
       4.Oracle中RAW和Varchar2常用的两个转换函数                           
       1). UTL_RAW.CAST_TO_RAW  该函数按照缺省字符集(一般为GB2312),将VARCHAR2字符串转换为RAW。
       2). UTL_RAW.CAST_TO_VARCHAR2 该函数按照缺省字符集合(一般为GB2312),将RAW转换为VARCHAR2。
       当使用HEXTORAW时,会把字符串中数据当作16进制数。而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中.
       5.存储过程中指定参数有时用这个符号 =>,DBMS_OBFUSCATION_TOOLKIT.MD5(input => raw_pwd, checksum => encode_pwd);这里raw_pwd就是传入的参数,而encode_pwd是加密后的数据.
       6.DBMS_OBFUSCATION_TOOLKIT.MD5返回的字串,是RAW类型.
<<To Be Continued>>

你可能感兴趣的:(oracle,sql,工作)