PL/SQL实战积累

本文分享了在实际工作中积累的PL/SQL编程经验,包括高效的数据操作、事务管理以及错误处理策略,有助于提升Oracle数据库开发能力。
摘要由CSDN通过智能技术生成
查询空表,一列,select 2013 AS year from dual
PLSQL输出语句 DBMS_OUTPUT.PUT_LINE(***)。

在output可以看到结果,相当于java的system.out.println 和 c++的 cout
但是pl/sql的比较弱,不能实时展示结果,要运行到end才会一次性显示结果。
而且在一个存储过程中不能使用太多次DBMS_OUTPUT.PUT_LINE,由于一次性输出,所以在执行到END之前,输出函数都会将结果保存在缓存区。用太多次会导致缓冲区放不下,会报错哒。
case when ... then ... else ... end 作用类似于decode函数。
CASE sex
WHEN '1' THEN ''
WHEN '2' THEN ''
ELSE '其他' END
或者像下面:
SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1      /*sex 1为男生,2位女生*/
                       ELSE NULL
                       END) 男生数,
                COUNT (CASE WHEN sex = 2 THEN 1
                       ELSE NULL
                       END) 女生数
    FROM students GROUP BY grade;
除此之外,在CASE WHEN 里面可以使用EXISTS关键字,例如:
CASE EXISTS(SELECT 1 FROM TABLE1 T1 WHERE T1.COL1=T2.COL1) THEN 1ELSE 0 END,....
select /*+parallel(a,4)*/ * from a 其中/*+parallel(a,4)*/表示多个线程并行执行,能够提高速度。
/*+提示信息*/ 用于SQL语句优化。
sql中的 游标用在多行语句中,游标类似于C++中的指针,或者java中的iterator能够一行一行的迭代多行数据。
定义记录类型相当于定义一个含有多个返回值的类。
触发器:当事件被触发时隐式的执行,事件指update,insert,delete...
oracle执行一条字符串sql语句的方法为:
declare
sql varchar2(100);
begin
sql := .....;
execute immediate command;
end;
WITH ... AS 用法
with
sql1 as (select to_char(a) s_name from test_tempa),
sql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))
select * from sql1
union all
select * from sql2
union all
select 'no records' from dual
where not exists (select s_name from sql1 where rownum=1)
and not exists (select s_name from sql2 where rownum=1)
遇到长的sql多用with as 分开sql的各个部分也方便后期修改。
如果要加快数据库查询的速度,可以采用不写日志和并发的方式执行,具体方法可以上网找,因为数据库几乎所有操作都会写日志,所以不写日志对于查询数据过大的情况会加快很多。
如果不采用pl/sql直接进入oracle服务器,可以采用指令对数据库进行操作。
PL\SQL在字符串中使用单引号“'”
在字符串中使用“''”,两个连接单引号可以表示一个单引号,第一个单引号表示“跳过”
例如:
select 'select * from table where name = ''yanghuanbin'' ' from dual;
输出结果为:
select * from table where name = 'yanghuanbin'
特殊符号ascii定义
制表符 chr(9)
换行符 chr(10)
回车符 chr(13)
在存储过程中返回多行需要用到游标
DECLARE
query_sql varchar2 ( 100 );
queryresult varchar2 ( 50 );
bizcursor SYS_REFCURSOR ;
type my_record is record (
servid NUMBER ( 16 ),
custid NUMBER ( 16 ));
my_rec my_record;
BEGIN
query_sql:= 'select servid,custid from sys_servst where rownum<10' ;
OPEN bizcursor FOR query_sql;
loop
fetch bizcursor into my_rec;
--判读是否提取到值,没取到值就退出
--取到值c_job%notfound 是false
--取不到值c_job%notfound 是true
exit when bizcursor% notfound ;
dbms_output.put_line(my_rec.servid||
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值