第五章 编写PL/SQL语言的可执行语句
<pre><code>--查看会话默认的时间格式
select hiredate from scott.emp;
--修改日志格式
alter session set nls_date_language = 'AMERICAN';
--PL/SQL使用默认的时间格式会自动转换
declare
v_date date;
begin
v_date := '1980/12/17';
end;
/
--推荐使用强制转换
declare
v_date date;
begin
v_date := to_date('1980/12/17','yyyy/mm/dd');
end;
/
--有注释的程序,输入3000正常,输入9999异常: numeric or value error: number precision too large
SQL> set verify off
SQL> set serveroutput on
declare
v_annual_sal emp.sal%type;
begin
/*Compute the annual salary based on the
monthly salary input from the user */
v_annual_sal := &p_monthly_sal * 12 ;
dbms_output.put_line('年薪是:'||v_annual_sal);--显示年薪
end;--这是程序块结束
/
--解决字符串长度异常问题
declare
v_annual_sal number(10,2);
begin
/*Compute the annual salary based on the
monthly salary input from the user */
v_annual_sal := &p_monthly_sal * 12 ;
dbms_output.put_line('年薪是:'||v_annual_sal);--显示年薪
end;--这是程序块结束
/
--使用sql中的函数
declare
v_desc varchar2(100) := '中国妇女解放运动的先驱----';
v_pioneer varchar2(25) := '潘金连';
v_string_length integer(5) ;
begin
dbms_output.put_line(v_desc||v_pioneer);
v_string_length := length(v_desc||v_pioneer);
dbms_output.put_line(v_string_length);
end;
/
--CHR(10)换行符,CHR()转换ASCII码
SQL> set line 2000;
SQL> set pagesize 40;
SQL> set serveroutput on
declare
v_daji_findings varchar2(10000);
v_daji1 varchar2(250) := '你知道历史上真正的苏妲己吗?她是一位受到诋毁最多的女性,是中国传统意义上狐妖祸乱的象征。';
v_daji2 varchar2(250) := '她用自己的美貌彻底颠覆了商汤王朝,从某种意义上说是建立大周朝的第一功臣。';
v_daji3 varchar2(250) := '也许,她是事业上最成功的女性,也是一位最敬业的女性。';
v_daji4 varchar2(250) := '而她对大周朝的赤胆忠心和卓越功绩换来的却是被顶头上司处死和千古骂名。';
v_daji5 varchar2(250) := '因为周武王和姜太公不想因为她的表现而损害了大周朝的声誉。';
v_daji6 varchar2(250) := '那些开国元勋们也不愿让这样的女性分享大周朝胜利的果实,结果是自己人都盼她死。';
v_daji7 varchar2(250) := '其实,姜子牙掩面斩妲己,不是因为她美,而是他认为自己无颜面对自己的下属。';
v_daji8 varchar2(250) := '最后,周朝的最高决策层只能编造出来狐狸精附体这样弥天大谎来哄骗天下和她的家人。';
v_daji9 varchar2(250) := '妲己一案向人们展示了周朝辉煌历史中一个最阴暗的角落。';
v_daji10 varchar2(250) := '妲己在爱情上却是一个彻底的失败者,为了事业,先后失去了两个真爱的人伯邑考和帝辛。';
v_daji11 varchar2(250) := '透过历史,我们可以看到人性丑陋的一面!!!';
begin
dbms_output.put_line('历史人物点评:');
v_daji_findings := v_daji1||CHR(10)||v_daji2||CHR(10)||v_daji3||CHR(10)||v_daji4||CHR(10)||v_daji5||CHR(10)||
v_daji6||CHR(10)||v_daji7||CHR(10)||v_daji8||CHR(10)||v_daji9||CHR(10)||v_daji10||CHR(10)||v_daji11;
dbms_output.put_line(v_daji_findings);
end;
--12c中序列的使用
--创建序列
create sequence dog_seq
start with 100
increment by 1
maxvalue 380380
nocycle;
select scott.dog_seq.currval from dual;
select scott.dog_seq.nextval from dual;
--新的使用方法
declare
v_dog_id number := 0;
begin
v_dog_id := dog_seq.nextval;
dbms_output.put_line('当前狗的序号是:'||v_dog_id);
end;
/
--旧的使用方法
declare
v_dog_id number := 0;
begin
select dog_seq.nextval into v_dog_id from dual;
dbms_output.put_line('当前狗的序号是:'||v_dog_id);
end;
/
--删除创建的序列
drop sequence dog_seq;
/*
三个常用的显示转换函数
to_char();
to_number;
to_date();
*/
--隐含数据类型转换
declare
v_dog_price number(8) := 8338;
v_dog_server varchar2(10) := '1250';
v_total_price v_dog_price%TYPE;
begin
--隐含转换
v_total_price := v_dog_price + v_dog_server ;
--显示转换
dbms_output.put_line('狗的实际售价为:¥'||to_char(v_total_price));
end;
/
--恒等、否定、指数运算符
SQL> set serveroutput on
declare
x number := 38;
y number := -28;
begin
dbms_output.put_line(x);
dbms_output.put_line(y);
dbms_output.put_line(-x);
dbms_output.put_line(-y);
dbms_output.put_line(+x);
dbms_output.put_line(+y);
y := 10 ** 3;
dbms_output.put_line(y);
end;
/
--程序块的嵌套和变量作用域
SQL> set serveroutput on
declare --整个程序块的作用域
v_mumdog_sex char(1) := 'F';
v_mumdog_weight number(5,2) := 63;
begin
declare --v_babydog_sex,v_babydog_weight作用域
v_babydog_sex char(1) := 'M';
v_babydog_weight number(5,2) := 3.8;
begin
dbms_output.put_line(v_babydog_sex);
dbms_output.put_line(v_babydog_weight);
dbms_output.put_line(v_mumdog_sex);
dbms_output.put_line(v_mumdog_weight);
end;
dbms_output.put_line(v_mumdog_sex); --这里如果使用子程序块的变量就会报错
dbms_output.put_line(v_mumdog_weight);
end;
/
--父子程序块都有相同的变量,就近读取,不会去子程序块读变量
declare
v_dog_sex char(1) := 'F';
v_dog_weight number(5,2) := 63;
begin
declare
v_dog_sex char(1) := 'M';
v_dog_weight number(5,2) := 3.8;
begin
dbms_output.put_line(v_dog_sex);
dbms_output.put_line(v_dog_weight);
dbms_output.put_line(v_dog_sex);
dbms_output.put_line(v_dog_weight);
end;
dbms_output.put_line(v_dog_sex);
dbms_output.put_line(v_dog_weight);
end;
/
--使用限定词,用<< 、 >>括起来
<<mumdog>>
declare
v_dog_sex char(1) := 'F';
v_dog_weight number(5,2) := 63;
begin
declare
v_dog_sex char(1) := 'M';
v_dog_weight number(5,2) := 3.8;
begin
dbms_output.put_line(v_dog_sex);
dbms_output.put_line(v_dog_weight);
dbms_output.put_line(mumdog.v_dog_sex);
dbms_output.put_line(mumdog.v_dog_weight);
end;
dbms_output.put_line(v_dog_sex);
dbms_output.put_line(v_dog_weight);
end;
/
--程序空格大小写在规范,不然易读性很差,如下两程序对比
--程序1
declare
v_gender char(1) := 'F';
v_person varchar2(20) ;
begin
if v_gender='M' then v_person := '帅哥'; else v_person := '靓女';end if;
end;
/
--程序2
declare
v_gender char(1) := 'F';
v_person varchar2(20) ;
begin
if v_gender='M' then
v_person := '帅哥';
else
v_person := '靓女';
end if;
end;
/</code></pre>