plsql与tsql的语法不同

insert into testtable(recordnumber,currentdate) values (i,sysdate);
print ‘';
select @i=@i+1;
end;

比较一下就可以看出来到底那里不一样了

plsql里面命令的结构为
delacre
定义语句段
begin
执行语句段
exception
异常处理语句段
end
这就是plsql程序总体结构图

定义变量与mssql的不同
基本方法
变量名 类型标识符【notnull】:=值
例 age number(8):=26
多了定义复合数据类型变量的功能
1.多了%type 变量
declare
mydate user。testtable.currentdate%type;
还有 %rowtype类型的变量可以识变量获得字段的数据类型,使用%rowtype可以识变量获得整个记录的数据类型。
变量名 数据表.列名%type
变量名 数据表%rowtype
declare
mytable testtbale%rowtype 包含了testtable 所有字段 只不过在输出时候可以选择输出那个
begin
shelect * into mytable
from temuuser.tedttbale
where recordnumber=88
dbms_output.put_line(mytable.currentdate);
end;
还有就是有了定义符合变量
格式
type 复合变量名 is record(
变量 类型, 可以有好几个);
变量名 复合变量名 这个变量名就好像java中类的对象一样而复合变量名就是类名可以这样理解 个人观点
begin
select * into 变量名 from 表名 where 条件
dbms_output.put_line(变量名.表中的值)
end

另外还可以定义一维数组
type 表类型 is table of 类型 index by binary_integer
表变量名 表类型
index by binary_integer子句代表以符号整数为索引,
这样访问表类型变量中的数据方法就是“表变量名(索引符号整数)”

Declare
type tabletype1 is table of varchar2(4) index by binary_integer;
type tabletype2 is table of tempuser.testtable.recordnumber%type index by
binary_integer;
table1 tabletype1;
table2 tabletype2;
begin
table1(1):='大学';
table1(2):='大专';
table2(1):=88;
table2(2):=55;
dbms_output.put_line(table1(1)||table2(1));
dbms_output.put_line(table1(2)||table2(2));
end;
一个标准的一维数组

定义多维表类型变量
定义了名为 tabletype1 的多维表类型,相当于多维数组,table1 是多维表类型变量,将数据表 tempuser.testtable 中
recordnumber为 60 的记录提取出来存放在 table1 中并显示。

type tabletype1 is table of testtable%rowtype index by binary_integer;
table1 tabletype1;
begin
select * into table1(60)
from tempuser.testtable
where recordnumber=60;
dbms_output.put_line(table1(60).recordnumber||table1(60).currentdate);
end;

在来看下面的这个程序
set serveroutput on
Declare
result integer;
begin
result:=10+3*4-20+5**2;
dbms_output.put_line('运算结果是:'||to_char(result));
end;

|| 这个符号是连接语句
to_char(result) dbms_output.put_line函数输出只能是字符串,因此利用 to_char函数将数值型结果转换为字符型。
To_char:将其他类型数据转换为字符型。 To_date:将其他类型数据转换为日期型。 To_number:将其他类型数据转换为数值型。

再说下plsql中的控制语句组合有哪几种

1. if..then..end if条件控制
if 条件 then
语句段;
end if;

2. if..then..else..end if条件控制
if 条件 then
语句段1;
else
语句段2;
end if;

3. if 嵌套条件控制
if 条件1 then
if 条件2 then
语句段1;
else
语句段2;
end if;
else
语句段3;
end if;

4.loop..exit..end loop 循环控制
loop
循环语句段;
if 条件语句 then
exit;
else
退出循环的处理语句段
end if;
end loop;

5. loop..exit..when..end loop 循环控制
采用 loop..exit..when..end loop 循环控制的语法结构与loop..exit..end loop 循环控制类似
exit when 实际上就相当于
if 条件 then
exit;
end if;

6.while..loop..end loop 循环控制
while 条件 loop
执行语句段
end loop;

7.for..in..loop..end 循环控制
for 循环变量 in [reverse] 循环下界..循环上界 loop
循环处理语句段;
end loop;
最后一个出个例子
set serveroutput on
declare
number1 integer:=80;
number2 integer:=90;
i integer:=0;
begin
for i in 1..10 loop
number1:=number1+1; 在mssql里是 sclect @number=@number+1
end loop;
dbms_output.put_line('number1的值:'||to_char(number1));
end;
本人学java 的 对plsql一看觉的很简单 和java比起来简单多了但是oracle 命令只是一部分更多的东西需要我去学习 自夸一下 哈哈

在plsql 多了事务处理命令

commit命令
commit事务提交命令。在oracle中为了保证数据的一致性在内存中将为每个客户机建立工作区,就是说在用commit命令之前的操作都在这个工作群里完成,只有在用commit命令之后才会把你写的命令写入到数据库中。
有个自动进行事务提交的命令
set auto on
关闭为 set auto off

rollback命令
rollback是事务回滚命令,在没有提交commit命令千,如果发现delete insert update等操需要恢复的话,可以用rollback命令会滚到上次commit时的状态。
set auto off 要先关闭自动提交
select * from scott.emp;
delete form scott.emp;
rollback
这个时候就可以看到 scott.emp还是以前的没有变化

savepoint命令
这个命令时保存点命令。事务通常由多个命令组成,可以将每个事务划分成若干个部分进行保存,这样回滚每个保存点,就不必回滚整个事务。
创建保存点 savepoint 保存点名
回滚保存点 rollback to 保存点名
来个例子
insert into scott.emp(empno,ename,sal) values(9000,'wang',2500); 先插入一个值
savepoint insertpoint; 创建一个还原点,名字叫insertpoint
rollback to insertpoint; 还原到那个还原点

下面开始说游标
这个东西在mssql里没有吧 我没有印象
游标不是c里面的指针,我一看到这个词就想到了指针可惜何c里面的指针大不一样 不要弄混了 估计没人会弄混。
游标可以说是一个临时的数据存放的地方
要用游标先要定义
cursor 游标名 is select 语句
cursor这是游标的关键字 selcet建立游标的查询命令
看个例子
set serveroutput on
declare
tempsal scott.emp.sal%type 定义了一个变量他是scott.emp.sal同一个类型
cursor mycursor is 定义一个游标mycursor
select * from scott.emp
where sal>tempsal;
begin
tempsal:=800;
open mycursor; 打开这个游标
end;
晕忘了 只是打开游标没有用 还要提取游标的数据
用fetch命令
fetch 游标名 into 变量1,变量2,。。。。;
或者
fetch 游标名 into 记录型变量名;
上面那个程序要改一下

set serveroutput on
declare
tempsal scott.emp.sal%type 定义了一个变量他是scott.emp.sal同一个类型
cursor mycursor is 定义一个游标mycursor
select * from scott.emp
where sal>tempsal
new scott.emp%rowtype; 有定义了一个新的变量
begin
tempsal:=800;
open mycursor; 打开这个游标
fetch mycursor into new; 读取游标数据把他添加到new中
dbms_output._line(to_char(new.sal)); 显示结果
close mysursor; close关闭这个游标
end;

游标的属性
1.%isopen属性
就是判断游标是否打开,如果没有打开就是用fetch语句提示错误
2.%found属性
就是测试前一个fetch语句是否有值,有就返回true 没有就返回false
3.%notfound属性 和上面的相反
4.%rowcount属性 判断游标的数据行数就是有多少数据

下面说下过程的概念 sql里没有
完整的过程的结构如下
create or replace 过程名 as
声明语句段;
begin
执行语句段;
exception
异常处理语句段;
end;
过程是有名称的程序块,as关键词代替了无名块的declare

创建实例的过程
创建一个名为tempprocdeure的过程,create是创建过程的标识符,replace表示如果又同名的过程将覆盖原过程。定义了一个变量,其类型何testtable数据表中的currentdate字段的类型相同,都是日期型,将数据表中的recordnumber字段为88的 currentdate字段内容送入变量中,然后输出结果。

set serveroutput on
creat or replace procedure tempuser.tempprocedure as
tempdate tempuser.testtable.currentdate%type;

begin
select currentdate
into tempdate
from testtable
where recordnumber=88;
dbms_output.put_line(to_char(tempdate));
end;
使用过程
set serveroutput on
begin
tempprocedure;
end;
下面说下带参数的过程
1.参数类型
in 读入参数 程序向过程传递数值
out 读出参数 过程向程序传递数值
in out 双向参数 程序过程互相传递数值
定义带参数的过程
set serveroutput on
creat or replace procedure scott.tempprocedure(
tempdeptno in scott.dept.deptno%type,/*定义了一个in类型的变量*/
tempdname out scott.dept.danme%type,/*定义了一个out类型的变量*/
temploc in out scott.dept.loc%type)as /*定义了一个inout型的变量*/
loc1 scott.dept.doc%type;
dname1 scott.dept.dname%type;
begin
select loc into loc1
from scott.dept
where deptno=tempdeptno;
select danme into danme1
from scott.dept
where deptno=tempdeptno;
temploc:='地址'||loc1;
tempdname:='姓名'||dname1;

end;

定义好了 下面开始用了
set serveroutput on
declare
myno scott.dept.deptno%type;
mydname scott.dept.dname%type;
myloc scott.dept.loc%type;

begin
myno:=10;
mydname:=”;
myloc:=”;
scott.tempprocedure(myno,mydname,myloc);
dbms_output.put_line(myno);
dbms_output.put_line(mydname);
dbms_output.put_line(myloc);
end;
搞定了
就是说用重新定义的三个变量当参数传递给上面定义的过程过程里带参数的变量可以接受这三个变量的值
用java语言来解释就是那个过程就是类 带三个参数
这三个变量就是数据 当然没有对象了哈哈毕竟不是java么哈哈

今天写到这里了 我要下班了 7.3

异常处理
就是程序中要处理特殊情况的办法

1. 定义异常处理
定义异常处理的语法如下:
declare
异常名 exception;
2. 触发异常处理
触发异常处理的语法如下:
raise 异常名;
3. 处理异常
触发异常处理后,可以定义异常处理部分,语法如下:
Exception
When 异常名 1 then
异常处理语句段 1;
When 异常名 2 then
异常处理语句段 2;

下面的 PL/SQL 程序包含了完整的异常处理定义、触发、处理的过程。定义名为 salaryerror
的异常,在 scott.emp 数据表中查找 empno=7566 的记录,将其值放入变量 tempsal 中,判断
tempsal 值若不在 900 和2600 之间,说明该员工的薪水有问题,将激活异常处理,提示信息。

set serveroutput on
declare
salaryerror exception;
tempsal scott.emp.sal%type;
begin
select sal into tempsal
from scott.emp
where empno=7566;
if tempsal <900 or tempsal>2600 then
raise salaryerror;
end if;
exception
when salaryerror then
dbms_output.put_line('薪水超出范围');
end;

(0)

相关推荐

  • plsql与tsql的语法不同

    insert into testtable(recordnumber,currentdate) values (i,sysdate); print ''; select @i=@i+1; end; 比较一下就可以看出来到底那里不一样了 plsql里面命令的结构为 delacre 定义语句段 begin 执行语句段 exception 异常处理语句段 end 这就是plsql程序总体结构图 定义变量与mssql的不同 基本方法 变量名 类型标识符[notnull]:=值 例 age number(

  • SQLServer 2008 新增T-SQL 简写语法

    1.定义变量时可以直接赋值 DECLARE @Id int = 5 2.Insert 语句可以一次插入多行数据 INSERT INTO StateList VALUES(@Id, 'WA'), (@Id + 1, 'FL'), (@Id + 2, 'NY') 3.支持+=操作符 SET StateId += 1 完整示例如下: 复制代码 代码如下: CREATE TABLE StateList(StateId int, StateName char(2)) GO -- Declare varia

  • plsql和tsql常用函数比对

    数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from dual 3.取整(小) S:select floor(-1.001) value O:select floor(-1.001) value from dual 4.取整(截取) S:select cast(-1.002

  • Oracle面试题及答案超全整理

    目录 1.MySQL和Oracle的区别: 2.Oracle中function和procedure的区别? 3. 比较truncate和delete命令 ? 4.oralce中 rowid, rownum的定义 5. 事务的特性(ACID)是指什么 6. 列举几种表连接方式 7. 描述oracle中tablespace和datafile之间的关系 8. 什么是逻辑备份 9. 什么是物理备份 10. NVL与NVL2两个函数的使用方法和差别? 11.union和union all的区别 12. m

  • SQL Server误区30日谈 第13天 在SQL Server 2000兼容模式下不能使用DMV

    误区 #13.在SQL Server 2000兼容模式下不能使用DMV 错误       对于兼容模式已经存在了很多误解.80的兼容模式的数据库是否意味着能够附加或恢复到SQL Server 2000数据库?当然不是.这只是意味着一些T-SQL的语法,查询计划的行为以及一些其它方面和SQL Server 2000中行为一样(当然,如果你设置成90兼容模式则和SQL Server 2005中一样). 在SQL Server 2008中,你可以使用ALTER DATABASE SET COMPATI

  • javaScript基础语法介绍

    简介 JavaScript是一种脚本语言. (脚本,一条条的文字命令.执行时由系统的一个解释器,将其一条条的翻译成机器可识别的指令,然后执行.常见的脚本:批处理脚本.T-SQL脚本.VBScript等.) HTML只是描述网页长相的标记语言,没有计算.判断能力,如果所有计算.判断(比如判断文本框是否为空.判断两次密码是否输入一致)都放到服务器端执行的话网页的话页面会非常慢.用起来也很难用,对服务器的压力也很大,因此要求能在浏览器中执行一些简单的运算.判断.JavaScript就是一种在浏览器端执

  • SQLSever中的触发器基本语法与作用

    什么是触发器? 触发器是在对表进行插入.更新或删除操作时自动执行的存储过程. 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:update.insert.delete这些操作的时候,系统会自动调用执行该表上对应的触发器.SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有cre

  • 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程

    今天突然有同事问起,如何在sqlserver中调试存储过程(我们公司使用的是sqlserver 2008 R2),猛地一看,和以前使用sqlserver 2000真的有很大的不同,我真晕了. 于是琢磨了一下.SQLSERVER 2005中不知因何去掉了很重要的DEBUGGER功能,要调试,必须要安装VS2005专业版或者更高版本.非常不方便. 还好,SQLSERVER 2008中这个很重要而且方便的功能又回来了. 不过,SQLSERVER 2008的调试功能和SQL2000的方法差别很大.SQL

  • sqlserver存储过程语法详解

    存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令.定义总是很抽象.存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server).如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起.这样做的好处至少有三个:第一.大大提高效率.存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数.第二.提高安全性.假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着

  • SQL语句(T-SQL汇总) 用T-SQL画出这些图形

    我个人感觉数据库这方面对于程序员来说很重要,无论是对于JAVA程序员还是DOTNET程序员以及其他编程人员来说都是必须掌握的.为了帮助大家更好的来回顾T-SQL,本人利用空闲的时间整理的一下T-SQL的语句和语法.希望对大家有用! 好的!我们先来看几个图像: 棱形三角形正方形圆形矩形梯形 上面这些图形都是用T-SQL实现的,文章的最后我们一起来用T-SQL画出这些图形. 首先,我们开始回顾一下T-SQL的基本语法: 函数 abs(x):求绝对值: 例: select abs(-3) 值为:3 s

随机推荐