转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> ORACLE >> 正文
我的oracle笔记二(pl/sql 编程方面)         ★★★★

我的oracle笔记二(pl/sql 编程方面)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1798 更新时间:2009/4/22 22:03:42
1, :bnd2, :bnd3;
       用execute immediate来完成的时候,可以用
  declare
    l_sal   pls_integer;
  begin
    execute immediate ''''update employees SET salary = salary + 1000 where last_name=''''''''okcai'''''''' RETURNING INTO :1''''
   returning into v_sql;
    commit;
  end;
 
     
5、用ref cursor来完成动态游标的功能
declare
 type ct is ref cursor;
 cc ct;
 v_notify acc_woff_notify%rowtype;
begin
 open cc for ''''select * from acc_woff_notify'''';
 loop
  fetch cc into v_notify;
  exit when cc%notfound;
  dbms_output.put_line(v_notify.done_code);
 end loop;
 close cc;
end; 
      
6、重新编译
    对失效的过程
    sql>exec  dbms_utility.compile_schema(schema);
    如:
    sql>exec  dbms_utility.compile_schema(scott);

7.存储过程使用table类型
<1>.字符串数组
declare
 type regionType is table of varchar2(3) index by binary_integer;
 v_listRegion regionType;
 i number(2):=0;
begin
 v_listRegion(1):=''''571'''';
 v_listRegion(2):=''''572'''';
 v_listRegion(3):=''''573'''';
 v_listRegion(4):=''''574'''';
 v_listRegion(5):=''''575'''';
 v_listRegion(6):=''''576'''';
 v_listRegion(7):=null;
 i := 1;
 while i<= v_listRegion.last loop
  dbms_output.put_line( v_listRegion(i) );
  i := v_listRegion.next(i);
 end loop;
end;

<2>.rowtype数组
declare
 type CmUserType is table of cm_user%rowtype index by binary_integer;
 v_listUser CmUserType;
 i number(5):=0;
 r_user cm_user%rowtype;
begin
 
 i := 1;
 for r_user in (select * from cm_user where rownum<=5) loop
  v_listUser(i):= r_user;
  i := i + 1;
 end loop;
 
 i := 1;
 while i<= v_listUser.last loop
  dbms_output.put_line( v_listUser(i).bill_id );
  i := v_listUser.next(i);
 end loop;
end;

<3>. record数组
declare
 type recCmUserType is record  (bill_id cm_user.bill_id%type,cust_name varchar2(25));
 type CmUserType is table of recCmUserType index by binary_integer;
 v_listUser CmUserType;
 i number(5):=0;
 r_user cm_user%rowtype;
begin
 
 i := 1;
 for r_user in (select * from cm_user where rownum<=5) loop
  v_listUser(i).bill_id:= r_user.bill_id;
  v_listUser(i).cust_name:= ''''客户''''||i;
  i := i + 1;
 end loop;
 
 i := 1;
 while i<= v_listUser.last loop
  dbms_output.put_line( v_listUser(i).bill_id );
  dbms_output.put_line( v_listUser(i).cust_name );
  i := v_listUser.next(i);
 end loop;
end;

8、存储函数和过程
   
     查看函数和过程的状态
     SQL>select object_name,status from user_objects where object_type=''''FUNCTION'''';
     SQL>select object_name,status from user_objects where object_type=''''PROCEDURE'''';
     
     查看函数和过程的源代码
        SQL>set long 1000
        SQL>set pagesize 0
 SQL>set trimspool on
     SQL>select text from all_source where owner=user and name=upper(''''&plsql_name'''');
     
9、触发器
   
     查看触发器

     set long 50000;
     set heading off;
     set pagesize 2000;

     select
     ''''create or replace trigger "'''' ||
              trigger_name || ''''"'''' || chr(10)||
      decode( substr( trigger_type, 1, 1 ),
              ''''A'''', ''''AFTER'''', ''''B'''', ''''BEFORE'''', ''''I'''', ''''INSTEAD OF'''' ) ||
                   chr(10) ||
      triggering_event || chr(10) ||
      ''''ON "'''' || table_owner || ''''"."'''' ||
            table_name || ''''"'''' || chr(10) ||
      decode( instr( trigger_type, ''''EACH ROW'''' ), 0, null,
                 ''''FOR EACH ROW'''' ) || chr(10) ,
      trigger_body
     from user_triggers;

10. 加密ORACLE的存储过程
用wrap命令,如:
    下列存储过程内容放在AA.SQL文件中
    create or replace procedure testCCB(i in number) as
    begin
    dbms_output.put_line(''''输入参数是''''||to_char(i));
    end;

    SQL>wrap iname=a.sql;
    PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Tue Nov 27 22:26:48 2001
    Copyright (c) Oracle Corporation 1993, 2000.  All Rights Reserved.
    Processing a.sql to a.plb
    提示a.sql转换为a.plb,这就是加密了的脚本,执行a.plb即可生成加密了的存储过程
    运行a.plb
    SQL> @a.plb ;

11.怎么样利用游标更新数据
cursor c1 is
select * from tablename
    where name is null for update [of column]
...
update tablename set column = ...
where current of c1;

但是如果这种方式打开以后做了commit,则下次fetch会报ora-01002错误

12.怎样自定义异常
pragma_exception_init(exception_name,error_number);
如果立即抛出异常
raise_application_error(error_number,error_msg,true|false);
其中number从-20000到-20999,错误信息最大2048B
异常变量
SQLCODE 错误代码
SQLERRM 错误信息

13.在pl/sql中执行DDL语句
<1>、8i以下版本dbms_sql包
<2>、8i以上版本还可以用
execute immediate sql;
dbms_utility.exec_ddl_statement(''''sql'''');

14.用java写存储过程包
<1>
create or replace and compile
java source
named "CHelloWorld" as
public class HelloWorld
{
  public static String print()
  {
         return System.out.println("Hello,World");
  }
};
/


<2>
create or replace function my_helloWorld return varchar2
as language java
name ''''HelloWorld.print() return java.lang.String'''';
/

<3>
select my_helloWorld from dual;

上一页  [1] [2] 


[Access]sql随机抽取记录  [Access]ASP&SQL让select查询结果随机排序的实现方法
[系统软件]SQL语句性能优化--LECCO SQL Expert  [C语言系列]SQL Server到DB2连接服务器的实现
[C语言系列]SQL Server到SYBASE连接服务器的实现  [C语言系列]SQL Server到SQLBASE连接服务器的实现
[C语言系列]SQL Server连接VFP数据库的实现  [C语言系列]ASP+SQL Server之图象数据处理
[C语言系列]SQL Server连接ACCESS数据库的实现  [C语言系列]DBA的最佳选择—图形界面还是T-SQL命令?
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台