加载中…
个人资料
dragon
dragon
  • 博客等级:
  • 博客积分:0
  • 博客访问:535
  • 关注人气:6
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在PLSQL块中执行SQL语句

(2009-06-04 21:43:37)
标签:

音乐

my

from

for

杂谈

分类: 学习总结

PLSQL块中执行SQL语句

A.   数据定义DDL

create,drop,truncate,不能直接执行,truncate执行时只做数据删除,不写日起,不维护索引

在PLSQL块中执行字符串SQL语句

注意:在PL/SQL块中可以直接执行,通常没有必要,除非表名和字段名是动态的。

Execute immediate “DDL语句”

Execute immediate “select 语句” into 变量名

DECLARE

       my_sql VARCHAR2(200);

       my_row emp%ROWTYPE;

BEGIN

     my_sql :='select * from emp where empno = 7788';

     EXECUTE IMMEDIATE my_sql INTO my_row;

     dbms_output.put_line(my_row.ename);

END;

Open cursor变量 for “select语句”

DECLARE

       TYPE cur_type IS REF CURSOR;

       my_sql VARCHAR2(200);

       my_cur cur_type;

       my_row emp%ROWTYPE;

BEGIN

     my_sql :='SELECT * FROM emp WHERE sal >= 3000';

     OPEN my_cur FOR my_sql;

     FETCH my_cur INTO my_row;

     WHILE(my_cur%FOUND)

     LOOP

         dbms_output.put_line(my_row.ename);

         FETCH my_cur INTO my_row;

     END LOOP;

     CLOSE my_cur;

END;

B.   数据修改DML

insert,delete,update,可直接执行,通过SQL对象返回影响行数

SQL对象:保存增删改语句执丢后的状态

SQL%ROWCOUNT 影响行数

SQL%FOUND 有数据

C.   数据查询:

查询单行:使用select into语句,返回一行记录正常执行,0行或多行需要捕捉异常

捕捉异常

DECLARE

       my_row emp%ROWTYPE;

BEGIN

     SELECT *

     INTO my_row

     FROM EMP

     WHERE empno = 7788;

     dbms_output.put_line(my_row.EMPNO||'   '||my_row.ENAME);

     EXCEPTION

     WHEN no_data_found THEN

          dbms_output.put_line('没有该工号!');

     WHEN too_many_rows THEN

          dbms_output.put_line('多个员工使用一个工号!');

     WHEN OTHERS THEN

          dbms_output.put_line(Sqlcode||'  '||SQLERRM);    

END;

实际应用时通过影响行数来判断

Declare I number begin select count(*) into I form emp where empno = 7788 if(I=1) then…

查询多行:使用显示游标,循环取出每条数据(for循环和cursor)

需要对查询中每条记录进行逐条处理时使用

游标:对象或查询数据所在的内存地址

----用FOR循环

BEGIN

     FOR temp IN(SELECT ename FROM emp WHERE sal >= 3000)

     LOOP

         dbms_output.put_line(temp.ename);

     END LOOP;

END;

----用cursor

DECLARE

       CURSOR my_cur IS SELECT ename FROM emp WHERE sal >= 3000;

       my_row my_cur%ROWTYPE;

BEGIN

     OPEN my_cur;

     FETCH my_cur INTO my_row;

     WHILE(my_cur%FOUND)

     LOOP

         dbms_output.put_line(my_row.ename);

         FETCH my_cur INTO my_row;

     END LOOP;

     CLOSE my_cur;

END;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有