设为首页 收藏本站
查看: 429|回复: 0

[经验分享] Oracle PL/SQL笔记

[复制链接]

尚未签到

发表于 2016-7-18 10:26:42 | 显示全部楼层 |阅读模式
declare
v_first_name varchar2(35);
v_last_name varchar2(35);
c_student_id constant number := 2223;
begin
select first_name, last_name
into v_first_name, v_last_name
from student
where student_id = c_student_id;
dbms_output.put_line('Student name: ' || v_first_name || ' ' || v_last_name);
exception
when no_data_found then
dbms_output.put_line('There is no student with student id '||c_student_id);
end;


BEGIN
INSERT INTO ZIPCODE (zip, city, state, created_by, created_date,   
modified_by, modified_date)
VALUES ('10027', 'NEW YORK', 'NY', USER, SYSDATE, USER, SYSDATE);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DECLARE
v_err_code NUMBER := SQLCODE;
v_err_msg VARCHAR2(100) := SUBSTR(SQLERRM, 1, 100);
BEGIN
DBMS_OUTPUT.PUT_LINE ('Error code: '||v_err_code);
DBMS_OUTPUT.PUT_LINE ('Error message: '||v_err_msg);
END;
END;

declare
--rowtype:行记录类型
vr_student student%rowtype;
begin
select *
into vr_student
from student
where student_id = 156;
--用“.”来访问行记录属性
dbms_output.put_line(vr_student.first_name || ' ' || vr_student.street_address || ' has an ID of 156');
exception
when no_data_found then
raise_application_error(-20001,'the student is not in the database');
end;
declare
cursor c_zip is  -- 声明游标
select *
from zipcode;
vr_zip c_zip%rowtype; --游标行类型
begin
open c_zip;  --打开游标
loop
fetch c_zip into vr_zip; --对游标集合内的每个数据行操作
exit when c_zip%notfound;
dbms_output.put_line(vr_zip.city);
end loop; -- loop结束,自动关闭游标
end;

DECLARE
v_sid      student.student_id%TYPE;
CURSOR c_student IS
SELECT student_id
FROM student
WHERE student_id < 110;
BEGIN
OPEN c_student;
LOOP
FETCH c_student INTO v_sid;
EXIT WHEN c_student%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('STUDENT ID : '||v_sid);
END LOOP;
CLOSE c_student;
EXCEPTION
WHEN OTHERS
THEN
IF c_student%ISOPEN
THEN
CLOSE c_student;
END IF;
END;

DECLARE
CURSOR c_student_enroll IS
SELECT s.student_id, first_name, last_name,
COUNT(*) enroll,
(CASE  
WHEN count(*) = 1 Then ' class.'
WHEN count(*) is null then
' no classes.'
ELSE ' classes.'
END) class                     
FROM student s, enrollment e
WHERE s.student_id = e.student_id
AND s.student_id <110
GROUP BY s.student_id, first_name, last_name;
r_student_enroll    c_student_enroll%ROWTYPE;
BEGIN
OPEN c_student_enroll;
LOOP
FETCH c_student_enroll INTO r_student_enroll;
EXIT WHEN c_student_enroll%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Student INFO: ID '||
r_student_enroll.student_id||' is '||
r_student_enroll.first_name|| ' ' ||
r_student_enroll.last_name||
' is enrolled in '||r_student_enroll.enroll||
r_student_enroll.class);
END LOOP;
CLOSE c_student_enroll;
EXCEPTION
WHEN OTHERS
THEN
IF c_student_enroll %ISOPEN
THEN
CLOSE c_student_enroll;
END IF;
END;

DECLARE
CURSOR c_group_discount IS
SELECT DISTINCT s.course_no
FROM section s, enrollment e
WHERE s.section_id = e.section_id
GROUP BY s.course_no, e.section_id, s.section_id
HAVING COUNT(*)>=8;
BEGIN
FOR r_group_discount IN c_group_discount   LOOP
UPDATE course
SET cost = cost * .95
WHERE course_no = r_group_discount.course_no;
END LOOP;
COMMIT;
END;
DECLARE
CURSOR c_group_discount IS
SELECT DISTINCT s.course_no
FROM section s, enrollment e
WHERE s.section_id = e.section_id
GROUP BY s.course_no, e.section_id, s.section_id
HAVING COUNT(*)>=8;
v_course_no c_group_discount%rowtype;
BEGIN
open c_group_discount;
LOOP
fetch c_group_discount into v_course_no;
UPDATE course
SET cost = cost * .95
WHERE course_no = v_course_no.course_no;
END LOOP;
COMMIT;
END;
select count(*) from student;
select * from student;
select * from student where created_by = 'xls';
create or replace trigger student_bi
before insert on student
for each row
declare
v_student_id student.student_id%type;
begin
select student_id_seq.nextval
into v_student_id
from dual;
:new.student_id := v_student_id;
:new.created_by := user;
:new.created_date := sysdate;
:new.modified_by := user;
:new.modified_date := sysdate;
end;
INSERT INTO student (student_id, first_name, last_name, zip,  
registration_date, created_by, created_date, modified_by,   
modified_date)
VALUES (STUDENT_ID_SEQ.NEXTVAL, 'John', 'Smith', '00914', SYSDATE,  
USER, SYSDATE, USER, SYSDATE);

INSERT INTO student (first_name, last_name, zip, registration_date)
VALUES ('John', 'Smith', '00914', SYSDATE);
create or replace trigger instructor_aud
after update or delete on instructor
declare
v_type varchar2(10);
pragma autonomous_transaction;
begin
if UPDATING then
v_type := 'UPDATE';
elsif deleting then
v_type := 'DELETE';
end if;
update statistics
set transaction_user = user,
transaction_date = sysdate
where table_name = 'INSTRUCTOR'
and transaction_name = v_type;
if sql%notfound then
insert into statistics
values('INSTRUCTOR', v_type, user, sysdate);
end if;
commit;
end;
UPDATE instructor
SET phone = '7181234567'
WHERE instructor_id = 101;

SELECT *
FROM statistics;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245725-1-1.html 上篇帖子: oracle的sql循环 下篇帖子: PL/SQL(oracle)7_函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表