PLSQL
SQL> -- 书写一个最简单的PLSQL
SQL> select 'hello' from dual;
'HELLO'                                                                         
----------                                                                      
hello                                                                           
SQL> declare
  2   -- 申明部分
  3  begin
  4   -- 执行的sql语句
  5   dbms_output.putline('hello world');
  6  
  7  end;
  8  /
 dbms_output.putline('hello world');
                      *
第 5 行出现错误: 
ORA-06550: 第 5 行, 第 14 列: 
PLS-00302: 必须声明 'PUTLINE' 组件
ORA-06550: 第 5 行, 第 2 列: 
PL/SQL: Statement ignored 
SQL> declare
  2   -- 申明部分
  3  begin
  4   -- 执行的sql语句
  5   dbms_output.put_line('hello world');
  6  
  7  end;
  8  /
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3  begin
  4   -- 执行的sql语句
  5   dbms_output.put_line('hello world');
  6  
  7  end;
  8  /
hello world                                                                     
PL/SQL 过程已成功完成。
SQL> select * from emp;
     EMPNO ENAME                JOB                       MGR HIREDATE          
---------- -------------------- ------------------ ---------- --------------    
       SAL       COMM     DEPTNO                                                
---------- ---------- ----------                                                
      2016                      SAL                                             
      8000                                                                      
                                                                                
      2015 zhangsan             MANAGER                  2016 18-3月 -16        
      5000       3000         20                                                
                                                                                
      7369 SMITH                CLERK                    7902 17-12月-80        
       800                    20                                                
                                                                                
     EMPNO ENAME                JOB                       MGR HIREDATE          
---------- -------------------- ------------------ ---------- --------------    
       SAL       COMM     DEPTNO                                                
---------- ---------- ----------                                                
      7499 ALLEN                SALESMAN                 7698 20-2月 -81        
      1600        300         30                                                
                                                                                
      7521 WARD                 SALESMAN                 7698 22-2月 -81        
      1250        500         30                                                
                                                                                
      7566 JONES                MANAGER                  7839 02-4月 -81        
      2975                    20                                                
                                                                                
     EMPNO ENAME                JOB                       MGR HIREDATE          
---------- -------------------- ------------------ ---------- --------------    
       SAL       COMM     DEPTNO                                                
---------- ---------- ----------                                                
      7654 MARTIN               SALESMAN                 7698 28-9月 -81        
      1250       1400         30                                                
                                                                                
      7698 BLAKE                MANAGER                  7839 01-5月 -81        
      2850                    30                                                
                                                                                
      7782 CLARK                MANAGER                  7839 09-6月 -81        
      2450                    10                                                
                                                                                
     EMPNO ENAME                JOB                       MGR HIREDATE          
---------- -------------------- ------------------ ---------- --------------    
       SAL       COMM     DEPTNO                                                
---------- ---------- ----------                                                
      7788 SCOTT                ANALYST                  7566 19-4月 -87        
      3000                    20                                                
                                                                                
      7839 ZS                   PRESIDENT                     17-11月-81        
     10000                    10                                                
                                                                                
      7844 TURNER               SALESMAN                 7698 08-9月 -81        
      1500          0         30                                                
                                                                                
     EMPNO ENAME                JOB                       MGR HIREDATE          
---------- -------------------- ------------------ ---------- --------------    
       SAL       COMM     DEPTNO                                                
---------- ---------- ----------                                                
      7876 ADAMS                CLERK                    7788 23-5月 -87        
      1100                    20                                                
                                                                                
      7900 JAMES                CLERK                    7698 03-12月-81        
       950                    30                                                
                                                                                
      7902 FORD                 ANALYST                  7566 03-12月-81        
      3000                    20                                                
                                                                                
     EMPNO ENAME                JOB                       MGR HIREDATE          
---------- -------------------- ------------------ ---------- --------------    
       SAL       COMM     DEPTNO                                                
---------- ---------- ----------                                                
      7934 MILLER               CLERK                    7782 23-1月 -82        
      1300                    10                                                
                                                                                
已选择16行。
SQL> set linesize 200l
SP2-0268: linesize 选项的编号无效
SQL> set linesize 200;
SQL> /
     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO                                                                                           
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------                                                                                           
      2016                      SAL                                                8000                                                                                                                 
      2015 zhangsan             MANAGER                  2016 18-3月 -16           5000       3000         20                                                                                           
      7369 SMITH                CLERK                    7902 17-12月-80            800                    20                                                                                           
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         30                                                                                           
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         30                                                                                           
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                    20                                                                                           
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         30                                                                                           
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    30                                                                                           
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                    10                                                                                           
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                    20                                                                                           
      7839 ZS                   PRESIDENT                     17-11月-81          10000                    10                                                                                           
     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO                                                                                           
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------                                                                                           
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         30                                                                                           
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                    20                                                                                           
      7900 JAMES                CLERK                    7698 03-12月-81            950                    30                                                                                           
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                    20                                                                                           
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                    10                                                                                           
已选择16行。
SQL> /
     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO                                                                                           
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------                                                                                           
      2016                      SAL                                                8000                                                                                                                 
      2015 zhangsan             MANAGER                  2016 18-3月 -16           5000       3000         20                                                                                           
      7369 SMITH                CLERK                    7902 17-12月-80            800                    20                                                                                           
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         30                                                                                           
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         30                                                                                           
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                    20                                                                                           
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         30                                                                                           
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    30                                                                                           
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                    10                                                                                           
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                    20                                                                                           
      7839 ZS                   PRESIDENT                     17-11月-81          10000                    10                                                                                           
     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO                                                                                           
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------                                                                                           
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         30                                                                                           
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                    20                                                                                           
      7900 JAMES                CLERK                    7698 03-12月-81            950                    30                                                                                           
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                    20                                                                                           
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                    10                                                                                           
已选择16行。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name varchar(20);
  4  begin
  5   -- 执行的sql语句
  6   select ename into name from emp;
  7   dbms_output.put_line(name);
  8  
  9  end;
 10  /
declare
*
第 1 行出现错误: 
ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在 line 6 
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name varchar(20);
  4  begin
  5   -- 执行的sql语句
  6   select ename into name from emp where empno=7566;
  7   dbms_output.put_line(name);
  8  
  9  end;
 10  /
JONES                                                                                                                                                                                                   
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name varchar(20);
  4   gongzi number;
  5  begin
  6   -- 执行的sql语句
  7   select ename into name from emp where empno=7566;
  8   select sal into gongzi from emp where empno = 7566;
  9   dbms_output.put_line(name);
 10   dbms_output.put_line(gongzi);
 11  
 12  end;
 13  /
JONES                                                                                                                                                                                                   
2975                                                                                                                                                                                                    
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name varchar(20);
  4   gongzi number;
  5  begin
  6   -- 执行的sql语句
  7   select ename into name from emp where empno=7566;
  8   dbms_output.put_line(name);
  9   dbms_output.put_line(gongzi);
 10  
 11  end;
 12  /
JONES                                                                                                                                                                                                   
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name varchar(20);
  4   gongzi number := 400;
  5  begin
  6   -- 执行的sql语句
  7   select ename into name from emp where empno=7566;
  8   dbms_output.put_line(name);
  9   dbms_output.put_line(gongzi);
 10  
 11  end;
 12  /
JONES                                                                                                                                                                                                   
400                                                                                                                                                                                                     
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name emp.ename%type;
  4  begin
  5   -- 执行的sql语句
  6   select ename into name from emp where empno=7566;
  7   dbms_output.put_line(name);
  8   dbms_output.put_line(gongzi);
  9  
 10  end;
 11  /
*
第 9 行出现错误: 
ORA-06550: 第 8 行, 第 23 列: 
PLS-00201: 必须声明标识符 'GONGZI'
ORA-06550: 第 8 行, 第 2 列: 
PL/SQL: Statement ignored 
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name emp.ename%type;
  4  begin
  5   -- 执行的sql语句
  6   select ename into name from emp where empno=7566;
  7   dbms_output.put_line(name);
  8  
  9  end;
 10  /
JONES                                                                                                                                                                                                   
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name emp.ename%type;
  4   myrow emp%rowtype;
  5  begin
  6   -- 执行的sql语句
  7   select ename into name from emp where empno=7566;
  8   select * into myrow from emp where empno = 7566;
  9   dbms_output.put_line(name);
 10   dbms_output.put_line(myrow.ename +" " + myrow.job);
 11  
 12  end;
 13  /
 dbms_output.put_line(myrow.ename +" " + myrow.job);
                                            *
第 10 行出现错误: 
ORA-06550: 第 10 行, 第 36 列: 
PLS-00201: 必须声明标识符 ' '
ORA-06550: 第 10 行, 第 2 列: 
PL/SQL: Statement ignored 
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name emp.ename%type;
  4   myrow emp%rowtype;
  5  begin
  6   -- 执行的sql语句
  7   select ename into name from emp where empno=7566;
  8   select * into myrow from emp where empno = 7566;
  9   dbms_output.put_line(name);
 10   dbms_output.put_line(myrow.ename);
 11  
 12  end;
 13  /
JONES                                                                                                                                                                                                   
JONES                                                                                                                                                                                                   
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name emp.ename%type;
  4   myrow emp%rowtype;
  5  begin
  6   -- 执行的sql语句
  7   select ename into name from emp where empno=7566;
  8   select * into myrow from emp where empno = 7566;
  9   dbms_output.put_line(name);
 10   dbms_output.put_line(myrow.job);
 11  
 12  end;
 13  /
JONES                                                                                                                                                                                                   
MANAGER                                                                                                                                                                                                 
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   -- 申明部分
  3   name emp.ename%type;
  4   myrow emp%rowtype;
  5  begin
  6   -- 执行的sql语句
  7   select ename into name from emp where empno=7566;
  8   select * into myrow from emp where empno = 7566;
  9   dbms_output.put_line(name);
 10   dbms_output.put_line(myrow.sal);
 11  
 12  end;
 13  /
JONES                                                                                                                                                                                                   
2975                                                                                                                                                                                                    
PL/SQL 过程已成功完成。
SQL> spool off;
SQL> set serveroutput on
SQL> declare
  2   weather varchar(20) := '晴天';
  3  begin
  4   if(weather = '晴天')
  5    then
  6     dbms_output.put_line('去爬山');
  7   end if;
  8  end;
  9  /
去爬山                                                                                                                                                                                                  
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   weather varchar(20) := '晴天2';
  3  begin
  4   if(weather = '晴天')
  5    then
  6     dbms_output.put_line('去爬山');
  7   else
  8    dbms_output.put_line('看电影');
  9   end if;
 10  end;
 11  /
看电影                                                                                                                                                                                                  
PL/SQL 过程已成功完成。
SQL> set serveroutput on
SQL> declare
  2   weather varchar(20) := '雨天';
  3  begin
  4   if(weather = '晴天')
  5    then
  6     dbms_output.put_line('去爬山');
  7   elseif(weather == '雨天')
  8    then
  9     dbms_output.put_line('睡觉');
 10   else
 11    dbms_output.put_line('看电影');
 12   end if;
 13  end;
 14  /
 elseif(weather == '雨天')
                        *
第 7 行出现错误: 
ORA-06550: 第 7 行, 第 18 列: 
PLS-00103: 出现符号 "="在需要下列之一时: 
( - + all case 
mod new null <an identifier> 
<a double-quoted delimited-identifier> <a bind variable> any 
avg count current max min prior some sql stddev sum variance 
execute forall merge time timestamp interval date 
<a string literal with character set specification> 
<a number> <a single-quoted SQL string> pipe 
<一个带有字符集说明的可带引号的字符串文字> 
<一个可带引号的 SQL 字符串> 
SQL> set serveroutput on
SQL> declare
  2   weather varchar(20) := '雨天';
  3  begin
  4   if(weather = '晴天')
  5    then
  6     dbms_output.put_line('去爬山');
  7   elseif(weather = '雨天')
  8    then
  9     dbms_output.put_line('睡觉');
 10   else
 11    dbms_output.put_line('看电影');
 12   end if;
 13  end;
 14  /
   dbms_output.put_line('睡觉');
    *
第 9 行出现错误: 
ORA-06550: 第 8 行, 第 3 列: 
PLS-00103: 出现符号 "THEN"在需要下列之一时: 
:= . ( % ;
ORA-06550: 第 13 行, 第 4 列: 
PLS-00103: 出现符号 ";"在需要下列之一时: 
if 
SQL> set serveroutput on
SQL> declare
  2   weather varchar(20) := '雨天';
  3  begin
  4   if(weather = '晴天')
  5    then
  6     dbms_output.put_line('去爬山');
  7   elsif(weather = '雨天')
  8    then
  9     dbms_output.put_line('睡觉');
 10   else
 11    dbms_output.put_line('看电影');
 12   end if;
 13  end;
 14  /
睡觉                                                                                                                                                                                                    
PL/SQL 过程已成功完成。
SQL> -- 作业 根据不同的成绩打印出相应的级别
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   index number := 1;
  3   sum number := 0;
  4  begin
  5   loop
  6    exit when index > 100
  7    sum = sum + index;
  8    index = index + 1;
  9   end loop;
 10   dbms_output.put_line(sum);
 11  end;
 12  /
 index number := 1;
 *
第 2 行出现错误: 
ORA-06550: 第 2 行, 第 2 列: 
PLS-00103: 出现符号 "INDEX"在需要下列之一时: 
begin 
function package pragma procedure subtype type use 
<an identifier> <a double-quoted delimited-identifier> form 
current cursor
符号 "begin在 "INDEX" 继续之前已插入。
ORA-06550: 第 3 行, 第 6 列: 
PLS-00103: 出现符号 "NUMBER"在需要下列之一时: 
:= . ( @ % 
;
符号 "." 被替换为 "NUMBER" 后继续。
ORA-06550: 第 6 行, 第 13 列: 
PLS-00103: 出现符号 "INDEX"在需要下列之一时: 
( - + case 
mod new not null <an identifier> 
<a double-quoted delimited-identifier> <a bind variable> avg 
count current exists max min prior sql stddev sum variance 
ex 
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   sum number := 0;
  4  begin
  5   loop
  6    exit when myindex > 100
  7    sum = sum + myindex;
  8    myindex = myindex + 1;
  9   end loop;
 10   dbms_output.put_line(sum);
 11  end;
 12  /
  sum = sum + myindex;
  *
第 7 行出现错误: 
ORA-06550: 第 7 行, 第 3 列: 
PLS-00103: 出现符号 "SUM"在需要下列之一时: 
* & - + ; / at 
mod remainder rem <an exponent (**)> and or || multiset 
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   mysum number := 0;
  4  begin
  5   loop
  6    exit when myindex > 100
  7    mysum = mysum + myindex;
  8    myindex = myindex + 1;
  9   end loop;
 10   dbms_output.put_line(mysum);
 11  end;
 12  /
  mysum = mysum + myindex;
  *
第 7 行出现错误: 
ORA-06550: 第 7 行, 第 3 列: 
PLS-00103: 出现符号 "MYSUM"在需要下列之一时: 
* & - + ; / 
at mod remainder rem <an exponent (**)> and or || multiset
符号 "and" 被替换为 "MYSUM" 后继续。
ORA-06550: 第 8 行, 第 11 列: 
PLS-00103: 出现符号 "="在需要下列之一时: 
:= . ( @ % ;
ORA-06550: 第 9 行, 第 2 列: 
PLS-00103: 出现符号 "END" 
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   mysum number := 0;
  4  begin
  5   loop
  6    exit when myindex > 100
  7    mysum := mysum + myindex;
  8    myindex := myindex + 1;
  9   end loop;
 10   dbms_output.put_line(mysum);
 11  end;
 12  /
  mysum := mysum + myindex;
  *
第 7 行出现错误: 
ORA-06550: 第 7 行, 第 3 列: 
PLS-00103: 出现符号 "MYSUM"在需要下列之一时: 
* & - + ; / 
at mod remainder rem <an exponent (**)> and or || multiset
符号 ";" 被替换为 "MYSUM" 后继续。 
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   mysum number := 0;
  4  begin
  5   loop
  6    exit when myindex > 100;
  7    mysum := mysum + myindex;
  8    myindex := myindex + 1;
  9   end loop;
 10   dbms_output.put_line(mysum);
 11  end;
 12  /
5050                                                                                                                                                                                                    
PL/SQL 过程已成功完成。
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   mysum number := 0;
  4  begin
  5   loop
  6    exit when myindex > 100;
  7    mysum = mysum + myindex;
  8    myindex = myindex + 1;
  9   end loop;
 10   dbms_output.put_line(mysum);
 11  end;
 12  /
  mysum = mysum + myindex;
        *
第 7 行出现错误: 
ORA-06550: 第 7 行, 第 9 列: 
PLS-00103: 出现符号 "="在需要下列之一时: 
:= . ( @ % ;
ORA-06550: 第 8 行, 第 3 列: 
PLS-00103: 出现符号 "MYINDEX"
ORA-06550: 第 9 行, 第 2 列: 
PLS-00103: 出现符号 "END" 
SQL> -- 总结: 不要用关键字来做变量的名称 2. 赋值一定要用:=
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   mysum number := 0;
  4  begin
  5   while myindex <=100;
  6   loop
  7    mysum := mysum + myindex;
  8   end loop;
  9  
 10   dbms_output.put_line(mysum);
 11  end;
 12  /
 while myindex <=100;
                    *
第 5 行出现错误: 
ORA-06550: 第 5 行, 第 21 列: 
PLS-00103: 出现符号 ";"在需要下列之一时: 
* & - + / at 
loop mod remainder rem <an exponent (**)> and or || multiset 
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   mysum number := 0;
  4  begin
  5   while myindex <=100;
  6   loop
  7    mysum := mysum + myindex;
  8    myindex = myindex + 1;
  9   end loop;
 10  
 11   dbms_output.put_line(mysum);
 12  end;
 13  /
 while myindex <=100;
                    *
第 5 行出现错误: 
ORA-06550: 第 5 行, 第 21 列: 
PLS-00103: 出现符号 ";"在需要下列之一时: 
* & - + / at 
loop mod remainder rem <an exponent (**)> and or || multiset
ORA-06550: 第 8 行, 第 11 列: 
PLS-00103: 出现符号 "="在需要下列之一时: 
:= . ( @ % ;
ORA-06550: 第 9 行, 第 2 列: 
PLS-00103: 出现符号 "END" 
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   mysum number := 0;
  4  begin
  5   while myindex <=100
  6   loop
  7    mysum := mysum + myindex;
  8    myindex = myindex + 1;
  9   end loop;
 10  
 11   dbms_output.put_line(mysum);
 12  end;
 13  /
  myindex = myindex + 1;
          *
第 8 行出现错误: 
ORA-06550: 第 8 行, 第 11 列: 
PLS-00103: 出现符号 "="在需要下列之一时: 
:= . ( @ % ;
ORA-06550: 第 9 行, 第 2 列: 
PLS-00103: 出现符号 "END" 
SQL> -- 计算一下1-100的和
SQL> set serveroutput on
SQL> declare
  2   myindex number := 1;
  3   mysum number := 0;
  4  begin
  5   while myindex <=100
  6   loop
  7    mysum := mysum + myindex;
  8    myindex := myindex + 1;
  9   end loop;
 10  
 11   dbms_output.put_line(mysum);
 12  end;
 13  /
5050                                                                                                                                                                                                    
PL/SQL 过程已成功完成。
SQL> spool off;
                    
                

                
            
        
浙公网安备 33010602011771号