学习:Oracle数据库plsql简单编程

工具:cmd sqlplus
内容:基本表的操作,plsql编程(分支结构,循环,判断等)
账户:scott

前期准备


cmd使用小技巧

由于笔者使用的是sqlplus,且是在cmd环境下进入的。cmd环境的文本编辑不太容易,故提供大家一点小技巧。

如图:

这里写图片描述

cmd 快捷键:alt+space+k 标记
选定区域后enter复制
alt+space+p 粘贴

!!!!标记可以选定任意范围,相比office中选定多行的固定模式超级好用有木有!!!


C:\Users\Administrator>sqlplus

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 4月 26 08:13:18 2018

Copyright (c) 1982, 2010, Oracle. All rights reserved.

请输入用户名: scott
输入口令:
ERROR:

ORA-12560: TNS: 协议适配器错误

如果碰到协议适配器错误,检查下服务有没有开启。
这里写图片描述
请输入用户名: scott
输入口令:

连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select * from user_role_privs;

USERNAME GRANTED_ROLE ADM DEF OS_


SCOTT CONNECT NO YES NO
SCOTT RESOURCE NO YES NO

SQL> select sysdate,systimestamp from dual;

SYSDATE

SYSTIMESTAMP

26-4月 -18
26-4月 -18 08.20.24.358000 上午 +08:00


正文:


SQL> print sname;
SP2-0552: 未声明绑定变量 "SNAME"。
SQL> set serveroutput on
SQL> declare
  2  sname varchar2(20) :='abcd';
  3  begin
  4  sname :=sname||'and tom';
  5  dbms_output.put_line(sname);
  6  end;
  7  /
abcdand tom

PL/SQL 过程已成功完成。

SQL> declare
2 ename varchar2(20default 'abc';
3 begin
4 select sname into ename from student where sno ='2015

SQL>set serveroutput on
SQL>declare
2 pi constant number :=3.14;
3 r number default 3;
4 area nubmer;
5 begin
6 area :=pi*r*r;
7 dbms_output.put_line(area);
8 end;
9 /
****

PL/SQL 过程已成功完成

SQL>var emp_name varchar2(30);
SQL>begin
2 select sname into : emp_name from student where sno='2018001';
3 end;
4 /

SQL> insert into student values('2018001','zhangsan','男','20');

已创建 1 行。

SQL> select * from student;

       SNO SNAME                SSEX                       SAGE
---------- -------------------- -------------------- ----------
   2018001 zhangsan             男                           20

SQL> var emp_name varchar2(30);
SQL> begin
  2  select sname into :emp_name from student where sno='2018001';
  3  end;
  4  /

PL/SQL 过程已成功完成。

SQL> print emp_name;

EMP_NAME
--------------------------------
zhangsan



----------
//修改scott账户权限
在plsql developer中要是以scott/tiger登录时提示ora-28000 the account is locked。

解决办法:

新装完Oracle10g后,用scott/tiger测试,会出现以下错误提示:
        oracle10g the account is locked
        oracle10g the password has expired
原因:默认Oracle10g的scott不能登陆。
解决:
(1)conn sys/sys as sysdba; //以DBA的身份登录
(2)alter user scott account unlock;// 然后解锁
(3)conn scott/tiger //弹出一个修改密码的对话框,修改一下密码就可以了

在运行里面输入cmd在DOS模式下输入sqlplus,以system用户名登录,密码是刚装oracle时自己填写的密码orcl,登录进去以后。

SQL> conn sys/sys as sysdba;       (分号是必须的但是我是以system登录的所在这不应该写conn sys/sys as sysdba应该写conn system/orcl as sysdba;)
         Connected.
SQL> alter user scott account unlock;
         User altered.
SQL> commit;
         Commit complete.
SQL> conn scott/tiger//请输入新密码,并确认后OK
Password changed
Connected.


----------

SQL> update  student set sname='张三' where sno='2018001';

已更新 1 行。

SQL> select * from student;

       SNO SNAME                SSEX                       SAGE
---------- -------------------- -------------------- ----------
   2018001 张三                 男                           20

SQL>

SQL> declare
  2  myemp student%rowtype;
  3  begin
  4  select * into myemp from student where sno='2018001';
  5  dbms_output.put_line(myemp.sname);
  6  end;
  7  /
zhangsan


----------
//查询james工资,如果大于900,则发放奖金若干

declare emp.sal % type;
//定义变量,与sal字段类型保持一致
select sal into newSal from emp
where ename='james';
if newSal>900 then
update emp
set comm=800
where ename='james';
end if;
commit;
end;


----------
//if else

SQL> declare
  2  newSal emp.sal % type;
  3  begin
  4  select sal into newSal from emp where ename='ALLEN';
  5  if newSal > 1000 then
  6  update emp set comm = 800 where ename ='ALLEN';
  7  else
  8  update emp set comm = 400 where ename ='ALLEN';
  9  end if;
 10  end;
 11  /

PL/SQL 过程已成功完成。

SQL> select * from emp;

ENAME                       SAL       COMM         ID
-------------------- ---------- ---------- ----------
SMITH                       800
ALLEN                      1600        800
WARD                       1250        500
JONES                      2975
MARTIN                     1250       1400
BLAKE                      2850
CLARK                      2450
SCOTT                      3000
KING                       5000
TURNER                     1500          0
ADAMS                      1100

ENAME                       SAL       COMM         ID
-------------------- ---------- ---------- ----------
JAMES                       950
FORD                       3000
MILLER                     1300

已选择14行。


----------
//选择结构
SQL> set serveroutput on
SQL>
SQL> declare
  2  v_grade char(1):=upper('&grade');
  3  begin
  4  case v_grade
  5  when 'A' then
  6  dbms_output.put_line('Excellent');
  7  when 'B' then
  8  dbms_output.put_line('Very Good');
  9  when 'C' then
 10  dbms_output.put_line('Good');
 11  else
 12  dbms_output.put_line('No such grade');
 13  end case;
 14  end;
 15  /
输入 grade 的值:  a
原值    2: v_grade char(1):=upper('&grade');
新值    2: v_grade char(1):=upper('a');
Excellent

PL/SQL 过程已成功完成。


----------
//选择结构
SQL> set serveroutput on
SQL>  declare
  2   v_grade char(1):=upper('&grade');
  3   p_grade varchar(20);
  4   begin
  5   p_grade :=
  6   case v_grade
  7   when 'A' then
  8   'Excellent'
  9   when 'B' then
 10   'Very Good'
 11   when 'C' then
 12   'Good'
 13   else
 14   'No such grade'
 15   end;
 16   dbms_output.put_line('Grade:'||v_grade||',the result is '||p_grade);
 17   end;
 18   /
输入 grade 的值:  a
原值    2:  v_grade char(1):=upper('&grade');
新值    2:  v_grade char(1):=upper('a');
Grade:A,the result is Excellent

PL/SQL 过程已成功完成。


----------
//loop循环 计算1+2+3+...+100的和

SQL> set serveroutput on
SQL>
SQL> declare
  2  counter number(3):=0;
  3  sumResult number:=0;
  4  begin
  5  loop
  6  counter := counter+1;
  7  sumResult :=sumResult+counter;
  8  if counter>=100 then exit;
  9  end if;
 10  end loop;
 11  dbms_output.put_line('result is:'||to_char(sumResult));
 12  end;
 13  /
result is:5050

PL/SQL 过程已成功完成。


----------
for循环

SQL>  set serveroutput on
SQL>  declare
  2   counter number(3):=0;
  3   sumResult number:=0;
  4   begin
  5   while counter<100 loop
  6   counter:=counter+1;
  7   sumResult:=sumResult+counter;
  8   end loop;
  9   dbms_output.put_line('result is:'||sumResult);
 10  end;
 11  /
result is:5050

PL/SQL 过程已成功完成。


----------
SQL>  set serveroutput on
SQL>  declare
  2   sumsal emp.sal % type;
  3    begin
  4    select sum(sal) into sumsal from emp;
  5    if sumsal>20000 then
  6    goto first_label;
  7  else
  8  goto second_label;
  9  end if;
 10  <<first_label>>
 11  dbms_output.put_line('ABOVE 20000:'||sumsal);
 12  <<second_label>>
 13  null;
 14  end;
 15  /
ABOVE 20000:29025

PL/SQL 过程已成功完成。


----------
SQL> select * from emp;

ENAME                       SAL       COMM         ID
-------------------- ---------- ---------- ----------
SMITH                       800
ALLEN                      1600        800
WARD                       1250        500
JONES                      2975
MARTIN                     1250       1400
BLAKE                      2850
CLARK                      2450
SCOTT                      3000
KING                       5000
TURNER                     1500          0
ADAMS                      1100

ENAME                       SAL       COMM         ID
-------------------- ---------- ---------- ----------
JAMES                       950
FORD                       3000
MILLER                     1300

已选择14行。

SQL> select sum(sal) from emp;

  SUM(SAL)
----------
     29025

猜你喜欢

转载自blog.csdn.net/qq_35206244/article/details/80091739