PL/SQL编程1-基础
编写第一个存储过程
create or replace procedure test_pro1 is
begin
insert into test1 values('','zydev');
end;
/
查看错误
show error
执行存储过程
exec procedure_name(value1,value2);
call procedure_name(value1,value2);
编写规范
单行注释 -- 多行注释 /*.......*/ 定义变量 v_name 定义常量 c_name 定义游标 name_cursor 定义例外 e_name
pl/sql块由定义部分(declear),执行部分(begin),例外处理部分(exception)三部分组成
最简单的一个块
SQL> set serveroutput on; --打开输出选项
SQL> begin
2 dbms_output.put_line('hello,world!!!!');
3 end;
4 /
一个完整的块
declare
--定义变量
v_ename varchar2(5);
v_sal number(7,2);
begin
--执行部分,&地址符,表示从控制台接收数据
select ename,sal into v_ename,v_sal from emp where empno=&a;
--在控制台显示用户名
dbms_output.put_line('用户名是:'||v_ename||' 工资: '||v_sal);
--异常处理
exception
when no_data_found then
dbms_output.put_line('The input error, please input again!!!');
end;
PL/SQL的复合变量
记录实例
declare
type myemp_record_type is record(name myemp.ename%type,sal myemp.sal%type,job myemp.job%type);
test_record myemp_record_type;
begin
select ename,sal,job into test_record from myemp where empno=&no;
dbms_output.put_line('姓名:'||test_record.name);
end;
表实例,相当于高级语言中的数组
declare
type myemp_table_type is table of myemp.ename%type index by binary_integer;
test_table myemp_table_type;
begin
select ename into test_table(0) from myemp where empno=7788;
dbms_output.put_line('姓名: '||test_table(0));
end;
参照变量
游标变量 -ref cursor
--输入部门号,显示所有员工工资和姓名
declare
--定义一个游标类型
type test_myemp_cursor is ref cursor;
--定义一个游标变量
test_cursor test_myemp_cursor;
--定义变量
v_name myemp.ename%type;
v_sal myemp.sal%type;
begin
--把游标变量和select结合
open test_cursor for select ename,sal from myemp where deptno=&no;
--循环取出
loop
fetch test_cursor into v_name,v_sal;
exit when test_cursor%notfound;
dbms_output.put_line('姓名: '||v_name||' 工资: '||v_sal);
end loop;
--关闭游标
close test_cursor;
end;
存储过程
输入参数
--create producure test_pro3
create or replace procedure test_pro3 (tName varchar2,newSal number) is
begin
update myemp set sal=newSal where ename=tName;
end;
java中调用
//演示Java调用Oracle的存储过程
package com.oracle;
import java.sql.*;
public class TestOraclePro {
public static void main(String agrs[]){
try {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到链接
Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mydev","scott","tiger");
//3.创建CallableStatement
CallableStatement cs=ct.prepareCall("{call test_pro3(?,?)}");
//4.给问号赋值
cs.setString(1, "SMITH");
cs.setInt(2, 8888);
//5.执行
cs.execute();
//6.关闭
cs.close();
ct.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
条件分支语句
create or replace procedure test_pro6(tName varchar2) is
--申明变量
v_job myemp.job%type;
--执行
begin
select job into v_job from myemp where ename=tName;
--判断
if v_job='PRESIDENT' then
update myemp set sal=sal+1000 where ename=tName;
elsif v_job='MANAGER' then
update myemp set comm=comm+500 where ename=tName;
else
update myemp set comm=comm+200 where ename=tName;
end if;
end;
循环语句
loop
--循环添加10个用户到user表中,用户编号从一开始增加
create or replace procedure test_pro7(tName varchar2) is
--定义 :=表示赋值
v_num number:=1;
begin
loop
insert into users values(v_num,tName);
exit when v_num=10;
v_num:=v_num+1;
end loop;
end;
while loop
--增加10个用户,编号从11开始
create procedure test_pro8(tName varchar2) is
v_num number:=11;
begin
while v_num<=20 loop
insert into users values(v_num,tName);
v_num:=v_num+1;
end loop;
end;
goto语句
--goto案例,一般开发不建议使用,会破坏程序结构,使其不易维护
declare
i int :=1;
begin
loop
dbms_output.put_line('输出i='||i);
if i=10 then
--直接跳转到<<end_loop>>
goto end_loop;
end if;
i:=i+1;
end loop;
dbms_output.put_line('循环结束1');
<<end_loop>>
dbms_output.put_line('循环结束2');
end;
函数
--创建函数,输入姓名,返回年薪
create function test_fun1(tName varchar2) return number is
yearSal number(7,2);
begin
select sal*12+nvl(comm,0)*12 into yearSal from myemp where ename=tName;
return yearSal;
end;
调用函数方法
var abc number
call test_pro1('SCOTT') into:abc
包pck
--创建包,声明改包有一个存储过程和函数
create or replace package test_pck1 is
procedure update_sal(name varchar2,newsal number);
function annual_income(name varchar2) return number;
end;
创建包体
--创建包体
create or replace package body test_pck1 is
procedure update_sal(name varchar2,newsal number) is
begin
update myemp set sal=newsal where ename=name;
end;
function annual_income(name varchar2) return number is
yearSal number;
begin
select sal*12+nvl(comm,0)*12 into yearSal from myemp where ename=name;
return yearSal;
end;
end;
调用包的过程或函数
call test_pck1.update_sal('SCOTT',120);
call test_pck1.annual_income('SCOTT') into:abc
例外处理
常见的预定义例外
1. no_data_found
declare
v_name emp.ename%type;
begin
select ename into v_name from emp where empno=&no;
dbms_output.put_line('名字是:'||v_name);
exception
when no_data_found then
dbms_output.put_line('无编号');
end;
2. case_not_found
declare
v_sal myemp.sal%type;
v_num myemp.empno%type;
begin
select sal,empno into v_sal,v_num from myemp where empno=&no;
case
when v_sal<1000 then
update myemp set sal=sal+1000 where empno=v_num;
when v_sal<2000 then
update myemp set sal=sal+500 where empno=v_num;
end case;
exception
when case_not_found then
dbms_output.put_line('无匹配项');
end;
自定义例外
create or replace procedure test_pro13(tNo number) is
--定义一个例外
myex exception;
begin
update myemp set sal=sal+100 where empno=tNo;
if sql%notfound then
raise myex;
end if;
exception
when myex then
dbms_output.put_line('没有更新用户');
end;
PL/SQL编程1-基础的更多相关文章
- Oracle PL/SQL编程之基础
1.简介:pl/sql块由三个部分组成:定义部分.执行部分.例外处理部分,如下所示: declare: /*定义部分---定义常量.变量.游标.例外.复杂数据类型 begin /*执行部分---要执行 ...
- Oracle数据库编程:PL/SQL编程基础
2.PL/SQL编程基础: PL/SQL块: declare 定义部分 begin 执行部分 exception 异 ...
- PL/SQL编程基础(三):数据类型划分
数据类型划分 在Oracle之中所提供的数据类型,一共分为四类: 标量类型(SCALAR,或称基本数据类型) 用于保存单个值,例如:字符串.数字.日期.布尔: 标量类型只是作为单一类型的数据存在,有的 ...
- 【PL/SQL编程基础】
[PL/SQL编程基础]语法: declare 声明部分,例如定义变量.常量.游标 begin 程序编写,SQL语句 exception 处理异常 end: / 正斜杠表示执行程序快范例 -- Cre ...
- PL/SQL 编程(一)基础,变量,分支,循环,异常
SQL和PL/SQL: SQL 结构化查询语言(Structural Query Language),是用来访问和操作关系型数据库的一种标准通用语言,属于第四代语言(4GL).可以方便的调用相应语句来 ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- pl/sql编程
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)
原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...
随机推荐
- SharePoint自动化系列——Upload files to SharePoint library using PowerShell.
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 日常的SharePoint站点测试中,我们经常要做各种各样的数据,今天又写了几个脚本,发现自己写的 ...
- activemq5.11整合spring4.2.3
前言 这篇博客记录 activemq5.11整合spring4.2.3的过程,免得以后忘记了 1.工程结构 2.pom.xml <project xmlns="http://maven ...
- BusyBox inittab配置
inittab第一行指定初始化脚本,开启所有应用程序,必须有. ::sysinit:/etc/init.d/rcS 在第一行执行完后,执行剩余行命令,此终端要接受命令交互需开启sh. ::askfir ...
- 一站式学习Wireshark(六):狙击网络高延时点
在某些情况下,丢包可能并不是造成延时的原因.你可能会发现尽管两台主机之间通讯速度很慢,但这种慢速并没有伴随着TCP重传或是重复ACK的征兆.在这种情况下,需要使用另一种方式来定位高延时点. 查找高延时 ...
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
- iOS边练边学--transform的简单介绍并且用transform实现键盘处理
一.transform:形变属性,能完成功能:平移,缩放,旋转 <平移> // 根据给的移动距离平移 self.tempView.transform = CGAffineTransform ...
- select文本框架(change事件)改变另外一个select的值
$('select[name=adults]').bind('change', function() { var $value = $(this).val(); if ($value >= 1) ...
- jquery 自动完成 Autocomplete插件汇总
1. jQuery Autocomplete Mod jQuery Autcomplete插件.能够限制下拉菜单显示的结果数. 主页:http://www.pengoworks.com/worksho ...
- ROS 教程之 vision : 用各种摄像头获取图像
可能有很多人想在ROS下学习视觉,先用摄像头获取图像,再用opencv做相应算法处理,可是ROS下图像的采集可不像平常的read一下那么简单,需要借助外部package的使用.而摄像头即可以用笔记本自 ...
- C# 窗体显示避免抢夺焦点
通过调用API进行显示可以避免抢夺焦点的问题 以下是API调用 using System.Runtime.InteropServices; [DllImport("user32.dll&qu ...