set serveroutput on;
declare
v_name varchar2(20);
v_sal number(7,2);
begin
select ename,sal into v_name,v_sal from emp where empno=&aa;
dbms_output.put_line('雇员名为:'||v_name||'雇员编号为:'||v_sal);
exception
when no_data_found then
dbms_output.put_line('你输入的编号有误,请重新输入。');
end;
--案例
create or replace procedure yj_pro3(yjname varchar2,newSal number) is
begin
update emp set sal=newSal where ename=yjname;
end;
--函数案例
create function yj_fun1(yjName varchar2) return number is yearSal number(7,2);
begin
select sal*12+nvl(comm,0) into yearSal from emp where ename=yjName;
return yearSal;
end;
--创建包
create package yj_package is
procedure update_sal(nam varchar2,newsal number);
function annual_income(name varchar2) return number;
end;
--给 yj_package 包实现包体
create package body yj_package is
procedure update_sal(nam varchar2,newsal number) is
begin
update emp set sal=newsal where ename=nam;
end;
function annual_income(name varchar2) return number is annual_salary number;
begin
select sal*12+nvl(comm,0) into annual_salary from emp where ename=name;
return annual_salary;
end;
end;
--下面以输入员工号,显示雇员姓名、工资、个人所得税
--(税率为0.03)为例。说明变量的使用,看看如何编写
declare
c_tax_rate number(3,2):=0.03;
--用户名
v_ename emp.ename%type;
v_sal emp.sal%type;
v_tax_sal number(7,2);
begin
--执行
select ename,sal into v_ename,v_sal from emp where empno=&no;
--计算
v_tax_sal:=v_sal*c_tax_rate;
--输出
dbms_output.put_line('姓名是:'||v_ename||'工资是:'||v_sal||'个人所得税是:'||v_tax_sal);
end;
--pl/sql记录实例
declare
--定义一个pl/sql记录类型emp_record_type,类型包含3个数据
type emp_record_type is record(
name emp.ename%type,
salart emp.sal%type,
title emp.job%type);
--定义了一个变量,变量的类型是emp_record_type
sp_record emp_record_type;
begin
select ename,sal,job into sp_record from emp where empno=7788;
dbms_output.put_line('员工名'||sp_record.name);
end;
--pl/sql表实例
declare
--定义一个pl/sql表类型sp_table,该类型是用于存放emp.ename%type
--index by binary_integer 表示下标是整数
type sp_table_type is table of emp.ename%type index by binary_integer;
--定义了一个sp_table变量,类型为sp_table_type
sp_table sp_table_type;
begin
select ename into sp_table(0) from emp where empno=7788;
dbms_output.put_line('员工名'||sp_table(0));
end;
--使用pl/sql编写一个块,可以输入部门号,并显示该部门所有的姓名和工资
declare
--定义一个游标
type sp_emp_cursor is ref cursor;
--定义变量
v_name emp.ename%type;
v_sal emp.sal%type;
--定义一个游标变量
test_cursor sp_emp_cursor;
begin
--把test_cursor和一个select结合
open test_cursor for select ename,sal from emp where deptno=&no;
--循环取出
loop
fetch test_cursor into v_name,v_sal;
--判断test_cursor是否为空
exit when test_cursor%notfound;
dbms_output.put_line('员工名'||v_name||',薪水'||v_sal);
end loop;
end;
--创建视图,把emp表的sal<1000的雇员映射到该视图(view)
create view myview as select * from emp where sal<1000;
--为简化操作,用一个视图解决显示雇员编号,姓名和部门名称
create or replace view myview as select emp.empno,emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;
java:
package com.sp;
import java.sql.*;
public class test {
//java程序去调用Oracle的存储功过程
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","1234");
//创建CallableStatement
CallableStatement cs=ct.prepareCall("{call yj_pro3(?,?)}");
//给?赋值
cs.setString(1, "Aro");
cs.setString(2, "50");
//执行
cs.execute();
cs.close();
ct.close();
}
}