PLSQL语法(掌握)
存储函数(了解)
存储过程(掌握)
JAVA来调用oracle函数或过程(掌握)[declare
--声明变量
]
begin
--代码逻辑
[exception
--异常处理
]
end;变量名 类型(长度);
-- 1.基本类型
变量名:=变量值-- 1+1=2的案例
declare
a int:=1;
b int:=1;
c number;
begin
c:=a+b;
dbms_output.put_line(c);
end;select 列名 into 变量名 from 表名 where 条件declare
num_sal number;
var_name varchar2(20);
begin
select ename,sal into var_name,num_sal from emp where empno=7369;
dbms_output.put_line(var_name||'工资是:'||num_sal);
end;
参考案例(同上做比较):
```plsql
select * from emp
declare
var_job emp.job%type;
var_name emp.ename%type;
begin
select ename,job into var_name,var_job from emp where empno=7369;
dbms_output.put_line(var_name||'职务:'||var_job);
end;declare
varEmp emp%rowtype;
begin
select * into varEmp from emp where empno= 7839;
dbms_output.put_line('员工'||varEmp.empno||'姓名'||varEmp.ename);
end;当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发
用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发
Oracle 预定义异常 21 个
exception
when 异常类型 then
异常处理逻辑declare
primary_iter exception; -- 定义一个自定义异常
pragma exception_init(primary_iter,-00001);
begin
insert into emp(empno,ename)values(7369,'sss');
exception
when primary_iter then
dbms_output.put_line('主键不能重复');
end;if 条件 then
业务逻辑
end if;declare
vnum number:=#
begin
if vnum=1 then
dbms_output.put_line('成功登录');
end if;
end;if 条件 then
业务逻辑
else
业务逻辑
end if;declare
vnum number:=#
begin
if vnum=1 then
dbms_output.put_line('登录成功');
else
dbms_output.put_line('登录失败');
end if;
end;if 条件 then
业务逻辑
elsif 条件 then -- 注意:这个长相:是els+if
业务逻辑
else
业务逻辑
end if;declare
age number:= #
begin
if age<18 then
dbms_output.put_line('未成年人');
elsif age>=18 and age<60 then
dbms_output.put_line('年轻人');
elsif age>=60 and age<80 then
dbms_output.put_line('中年人');
elsif age>=80 then
dbms_output.put_line('老人');
end if;
end;declare
age integer:=#
vresult varchar2(100); -- 别起result关键字;
begin
case
when age<18 then
vresult:='未成年人';
when age>=18 and age<60 then
vresult:='年轻人';
when age>=60 and age<80 then
vresult:='中年人';
when age>=80 then
vresult:='老年人';
end case;
dbms_output.put_line(vresult);
end;loop
--循环语句 类似于之前的do while循环
exit when 退出条件;
end loop;输出从1开始的100个数
declare
i number:=1;
begin
loop
dbms_output.put_line(i);
i:=i+1;
exit when i>100;
end loop;
end ;while 循环条件
loop
循环体
end loop;输出从1开始的100个数
declare
i number:=1;
begin
while i<=100 loop
dbms_output.put_line(i);
i:=i+1;
end loop;
end ;-- for(int i=1;i<结束值;i++){}
for 变量 in 起始值..终止值 loop
-- 循环语句
end loop;输出从1开始的100个数
begin
for i in 1..100
loop
dbms_output.put_line(i);
end loop;
end;insert into student(id,name)values(seq_test.nextval,'李四')
-- 向student表中插入1000条数据;使用while loop循环????
declare
i number :=1;
begin
while i<=1000 loop -- 当大于2755的时候,控制台会报错;插入没问题;
-- dbms_output.put_line(i); 在sql控制台输出
insert into student(id,name)values(seq_test.nextval,'李四'||i);
commit;
i:=i+1;
end loop;
end;存储函数又称为自定义函数,一种存储在数据库中的命令程序块。可以接收零或多个参数,必须有返回值。
创建或修改存储过程的语法如下:
CREATE [ OR REPLACE ] FUNCTION 函数名称(参数名称 参数类型, 参数名称 参数类型,...n)
RETURN 结果变量数据类型
IS
变量声明部分;
BEGIN
-- 逻辑部分;
RETURN 结果变量;
[EXCEPTION 异常处理部分]
END;需求:根两个数相加函数
create or replace function f_sum(a number,b number) return number
is fresult number; -- 这个是变量,fresult这个是需要return
begin
fresult:=a+b;
return fresult;
end;select f_sum(3,2) from dualCreate Or Replace Function Money2Chinese(Money In Number) Return Varchar2 Is
strYuan Varchar2(150);
strYuanFen Varchar2(152);
numLenYuan Number;
numLenYuanFen Number;
strRstYuan Varchar2(600);
strRstFen Varchar2(200);
strRst Varchar2(800);
Type typeTabMapping Is Table Of Varchar2(8) Index By Binary_Integer;
tabNumMapping typeTabMapping;
tabUnitMapping typeTabMapping;
numUnitIndex Number;
i Number;
j Number;
charCurrentNum Char(1);
Begin
If Money Is Null Then
Return Null;
End If;
strYuan := TO_CHAR(FLOOR(Money));
If strYuan = '0' Then
numLenYuan := 0;
strYuanFen := lpad(TO_CHAR(FLOOR(Money * 100)), 2, '0');
Else
numLenYuan := length(strYuan);
strYuanFen := TO_CHAR(FLOOR(Money * 100));
End If;
If strYuanFen = '0' Then
numLenYuanFen := 0;
Else
numLenYuanFen := length(strYuanFen);
End If;
If numLenYuan = 0 Or numLenYuanFen = 0 Then
strRst := '零圆整';
Return strRst;
End If;
tabNumMapping(0) := '零';
tabNumMapping(1) := '壹';
tabNumMapping(2) := '贰';
tabNumMapping(3) := '叁';
tabNumMapping(4) := '肆';
tabNumMapping(5) := '伍';
tabNumMapping(6) := '陆';
tabNumMapping(7) := '柒';
tabNumMapping(8) := '捌';
tabNumMapping(9) := '玖';
tabUnitMapping(-2) := '分';
tabUnitMapping(-1) := '角';
tabUnitMapping(1) := '';
tabUnitMapping(2) := '拾';
tabUnitMapping(3) := '佰';
tabUnitMapping(4) := '仟';
tabUnitMapping(5) := '万';
tabUnitMapping(6) := '拾';
tabUnitMapping(7) := '佰';
tabUnitMapping(8) := '仟';
tabUnitMapping(9) := '亿';
For i In 1 .. numLenYuan Loop
j := numLenYuan - i + 1;
numUnitIndex := Mod(i, 8);
If numUnitIndex = 0 Then
numUnitIndex := 8;
End If;
If numUnitIndex = 1 And i > 1 Then
strRstYuan := tabUnitMapping(9) || strRstYuan;
End If;
charCurrentNum := substr(strYuan, j, 1);
If charCurrentNum <> 0 Then
strRstYuan := tabNumMapping(charCurrentNum) ||
tabUnitMapping(numUnitIndex) || strRstYuan;
Else
If (i = 1 Or i = 5) Then
If substr(strYuan, j - 3, 4) <> '0000' Then
strRstYuan := tabUnitMapping(numUnitIndex) || strRstYuan;
End If;
Else
If substr(strYuan, j + 1, 1) <> '0' Then
strRstYuan := tabNumMapping(charCurrentNum) || strRstYuan;
End If;
End If;
End If;
End Loop;
For i In -2 .. -1 Loop
j := numLenYuan - i;
charCurrentNum := substr(strYuanFen, j, 1);
If charCurrentNum <> '0' Then
strRstFen := tabNumMapping(charCurrentNum) || tabUnitMapping(i) ||
strRstFen;
End If;
End Loop;
If strRstYuan Is Not Null Then
strRstYuan := strRstYuan || '圆';
End If;
If strRstFen Is Null Then
strRstYuan := strRstYuan || '整';
Elsif length(strRstFen) = 2 And substr(strRstFen, 2) = '角' Then
strRstFen := strRstFen || '整';
End If;
strRst := strRstYuan || strRstFen;
--strRst := Replace(strRst, '亿零', '亿');
--strRst := Replace(strRst, '万零', '万');
Return strRst;
End Money2Chinese;
-- 调用--
Select Money2Chinese(786.213) From dual;1、存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。
2、存储函数可以在 select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。
3、存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码。CREATE [ OR REPLACE ] PROCEDURE 存储过程名称
(参数名 类型, 参数名 类型, 参数名 类型)
IS|AS
变量声明部分; -- 注意这里结束
BEGIN
逻辑部分
[EXCEPTION
异常处理部分]
END;IN 传入参数(默认)OUT 传出参数 ,主要用于返回程序运行结果IN OUT 传入传出参数添加部门信息
-- 创建序列
create sequence seq_dept_id start with 60 increment by 10;
-- 创建存储过程
create or replace procedure pro_dept_addinfo
(
p_dname in varchar2, -- 部门名称
p_loc in varchar2 -- 部门位置
)
is
-- 这里
begin
insert into dept values(seq_dept_id.nextval,p_dname,p_loc);
commit;
end;call pro_dept_addinfo('软件测试','武汉');
or
begin
pro_dept_addinfo('软件质量','郑州');
end;
或者在命令行窗口执行
exec pro_dept_addinfo('公关部','郑州');
区别: 1.call一般用来在外部程序调用使用,例如JAVAEE;
2.begin end;一般用在在sql窗口执行;
3.exec 在命令行窗口使用;一般用来创建比较灵活输出的存储过程实用场景;
Create or replace procedure getRax(xsal in number,fee out number)
as
r number:=xsal-5000;
begin
case
when r<0 then fee:=0;
when r<=3000 then fee:=r*0.03;
when r<=12000 then fee:=r*0.1-210;
when r<=25000 then fee:=r*0.2-1410;
when r<=35000 then fee:=r*0.25-2660;
when r<=55000 then fee:=r*0.3-4410;
when r<=80000 then fee:=r*0.35-7160;
else
fee:=r*0.45-15160;
end case;
end;对于有数据返回的,在PL/SQL中只能使用begin end,不能使用call方式
-- 调用传出参数存储过程
declare
fee number;
begin
getRax(&xsal,fee);
dbms_output.put_line('应交税额:'||fee);
end;EXEC` `procedure ``;``--procedure是存储过程名begin
``procedure``;``--procedure是存储过程名
end``;hibernateDao.excuteSqlUpdate("{Call proc_stuInfo()}");//存储过程proc_stuInfodriver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
username=oracletest
password=rootpublic class JDBCUtil {
private static String driver;
private static String url;
private static String username;
private static String password;
private static Connection conn;
static {
try {
// 读取加载配置文件
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
pro.load(is);
driver = pro.getProperty("driver");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
// 加载驱动
Class.forName(driver);
// 连接oracle
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取数据库连接
public static Connection getConnection() {
conn = DriverManager.getConnection(url, username, password);
return conn;
}
/**
* 关闭资源
*
* @param rs
* @param stmt
* @param conn
*/
public static void close(ResultSet rs, Statement stmt, Connection conn) {
//关闭结果集
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭执行对象
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭执行对象
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}public class JDBCTest {
public static void main(String[] args) {
Connection conn = JDBCUtil.getConnection();
System.out.println(conn);
}
}以dept表为例,演示增删改查
public class Dept {
private Integer id;
private String dname;
private String loc;
// 省略有参和无参 getter和setter toString
}public class DeptDao {
public void addDept(Dept dept) throws SQLException {
Connection conn = JDBCUtil.getConnection();
String sql = "insert into dept (id,dname,loc) values (?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, dept.getId());
pstmt.setString(2,dept.getDname());
pstmt.setString(3,dept.getLoc());
pstmt.execute();
JDBCUtil.close(null,pstmt,conn);
}
}public class DeptTest {
public static void main(String[] args) throws SQLException {
DeptDao dao = new DeptDao();
Dept dept = new Dept(80,"总裁委员会","北京");
dao.addDept(dept);
}
}exp 用户名/密码@实例名 file=导出的dmp文件存放路径 log=导出日志存放路径exp 用户名/密码@实例名 file=文件名 full=yexp u1/123456 file='u1.dmp'imp 用户名/密码 file='文件'imp u1/123456 file='u1.dmp'exp system/oracletest owner=oracletest file=oracletest.dmpimp system/oracletest file=oracletest.dmp fromuser=oracletestexp oracletest/root file=a.dmp tables=deptimp oracletest/root file=a.dmp tables=dept我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some
我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.