PL/SQL:一般变量与替代变量

------------------PL/SQL数据类型----------------------
create table my_book_text
(book_id number(3),
book_descr varchar2(40),
book_text clob);
----------------------------------------
insert into my_book_text
values(3,'第三部分 PL/SQL高级编程','PL/SQL可用于创建存储过程、触发器和程序包等,用来处理业务规则、数据库事件或给SQL命令的执行添加程序逻辑。');
select * from my_book_text;
----------------------------------------
declare
  clob_var clob;
  amount integer;
  offset integer;
  output_var varchar2(100);
  begin
  select book_text into clob_var  from my_book_text--从表中选择 CLOB 定位符到 clob_var变量中
  where book_id=3;
  amount:=24;
  offset:=1;
  dbms_lob.read(clob_var,amount,offset,output_var);--从CLOB数据中读取24个字符存储到 output_var 变量中
  dbms_output.put_line(output_var);--显示读到的信息
  end;
------------------一般变量与替代变量----------------------
declare
    emp_code  number(4);
    emp_salary number(7,2);
  begin
    emp_code:=7499;
    select sal+comm into emp_salary from emp
    where empno=emp_code;
    dbms_output.put_line(emp_salary);
  end;
----------------------------------------
declare
  v_num number(5,2):=1.23;
  begin
    declare v_num char(10);
    begin
       v_num:=12345;
       dbms_output.put_line(v_num);
    end;
  dbms_output.put_line(v_num);
  end;
----------------------------------------
select empno,ename,sal,deptno from emp
 where empno=&employee_num;--7369
select empno,ename,sal,deptno from emp
 where empno=&employee_num;--7499
select empno,ename,job, &column_name from emp--sal
 where &condition--sal>3000
 order by &order_name;--ename
---------------------------------------
SELECT    empno, ename, job, &&column_name--deptno
  FROM    emp
 ORDER BY    &column_name;--使用带有两个&的变量可以使得该变量可以重复使用,而不必在每次使用时提醒用户输入.
---------------------------------------
ACCEPT   dept PROMPT 'Provide the department name: '
SELECT   * 
FROM     dept
WHERE    dname = UPPER('&dept');--sales 当接收用户输入时,创建可定制的用户提示
---------------------------------------
define name=ename
select &name,sal from emp;
一个变量将保持在被定义的状态,直到:
使用 UNDEFINE 命令将它清除
离开 SQL*Plus
-------------------PL/SQL块应用技巧--------------------
DECLARE     – 声明
Variables, cursors, user-defined exceptions
BEGIN     – 执行部分
SQL statements
PL/SQL statements
EXCEPTION   – 异常处理部分
Actions to perform when errors occur
END;   
一个基本的PL/SQL块由三部分组成:定义部分、可执行部分以及例外处理部分:
定义部分:
定义将在可执行部分中调用的所有变量、常量、游标和用户自定义的例外处理。这部分可以没有。
可执行部分:
包括对数据库中进行操作的SQL语句,以及对块中进行组织、控制的PL/SQL语句。这部分必须存在。
异常处理部分:
对可执行部分中的语句,在执行过程中出错或出现非正常现象时所做的相应处理。这部分可以没有。
------------------PL/SQL块 构成的存储过程
-----存储过程
CREATE OR REPLACE PROCEDURE 存储过程名称(
       s_no in varchar,
       s_name out varchar,
       s_age number) AS
total NUMBER := 0;
BEGIN
  SELECT COUNT(1) INTO total FROM student s WHERE s.age=s_age;
  dbms_output.put_line('符合该年龄的学生有'||total||'人');
  EXCEPTION
    WHEN too_many_rows THEN 
    DBMS_OUTPUT.PUT_LINE('返回值多于1行'); 
END 存储过程名称;

CREATE OR REPLACE PROCEDURE InsertIntoTemp AS
  v_Num1      NUMBER := 5;
  v_String1   VARCHAR2(50) := 'Hello World!';
  v_OutputStr VARCHAR2(50);
BEGIN
   INSERT INTO temp_table (num_col, char_col)
    VALUES (v_Num1, v_String1);
    SELECT char_col
    INTO v_OutputStr
  FROM temp_table
  WHERE num_col = v_Num1;
  DBMS_OUTPUT.PUT_LINE(v_OutputStr);
  
END InsertIntoTemp;

 create or replace procedure up_dept(no in integer)
 is
   invalidno exception;
 begin
  update dept set dname='nnnnnnn' where deptno=no;
   if sql%notfound then
       raise invalidno;
   end if;
 exception
   when invalidno then
    dbms_output.put_line('没找到deptno为'||no||'的行');
 null;
 end up_dept;

begin
  dbms_output.put_line('Hello, Oracle');
  end;
  
declare
  v_name varchar2(10);
  begin 
    select dname into v_name from dept
     where deptno=&dno;--10
    dbms_output.put_line('部门名称' || v_name);
  end;
  
declare
  v_name varchar2(10);
  begin
    select dname into v_name from dept
     where deptno=&dno;--20 90
    dbms_output.put_line('部门名称' || v_name);
  exception
      when no_data_found then 
    dbms_output.put_line('请输入正确的部门编号');
    end;
    
declare
  eno number(4);
  ena varchar2(15);
  esal number(7,2);
  begin
    select empno,ename,sal into ENO,ENA,ESAL FROM EMP
     WHERE EMPNO=&EMPID;--1000
  EXCEPTION
      WHEN NO_DATA_FOUND THEN
    dbms_output.put_line('职员编号不存在');
    END;

declare
  v_sal number(9,2):=&p_annual_sal;--500
  begin
    v_sal:=v_sal/12;
   dbms_output.put_line('The monthly salary is  ' || to_char(v_sal));
  end;

你可能感兴趣的:(数据库应用,sql,数据库,oracle)