- 浏览: 51744 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (49)
- ajax (3)
- js (5)
- java (10)
- Freemarker (2)
- tomcat (1)
- oracle (1)
- jquery (2)
- PL/SQL (3)
- SSH (2)
- jdbc (1)
- 我的异常 (3)
- Struts2 (2)
- servlet (2)
- quartz (1)
- javaEE标签 (1)
- spring (4)
- DateFormat (1)
- 开发之旅 (1)
- maven (1)
- uml (1)
- mock (1)
- angularJS (3)
- beanshell (1)
- http (1)
- 开源软件 (1)
- 非技术 (1)
- mysql (1)
- 反射 (1)
- field (1)
- 泛型 (1)
- spring boot (0)
- 注解 (0)
- 跨域 (1)
- 编程思想 (1)
- 工具类 (1)
- protocol buffer (1)
最新评论
-
Dragonmandance:
热烈欢迎第一位评论者~~
jquery判断checkbox是否被选中 -
天真小武:
哈哈··· 还真没碰到 ·· 现在算是打了个预防针··· ...
jquery判断checkbox是否被选中
二.pl/sql 编程方面
1.自治事务:8i以上版本,不影响主事务。 在存储过程的is\as 后面声明PRAGMA AUTONOMOUS_TRANSACTION; 自治事务防止嵌套提交,使事务在自己的事务区内提交或回滚不会影响其他的事务。 2、包 包说明(package specification),包头,存放关于包的内容的信息,定义包的用户可见的过程、 函数,数据类型和变量 create or replace package tt_aa as v1 varchar2(10); v2 varchar2(10); v3 number; v4 boolean; procedure proc1(x number); procedure proc2(y varchar2); procedure proc3(z number); function my_add(x number,y number) return number; end; 包主体(package body)是可选的 create or replace package body tt_aa as procedure proc1(x number) as begin v1:=to_char(x); end; procedure proc2(y varchar2) as begin v2:=y; end; procedure proc3(z number) as begin v1:=z; end; procedure proc4(x number,y number) return number as begin return x+y; end; end; 调用 begin tt_aa.proc1(6); dbms_output.put_line(to_char(tt_aa.my_add(1,3)); end; 3、动态sql(使用dbms_sql) create or replace procedure my_execute(sql_string in varchar2) as v_cursor number; v_numrows interger; begin v_cursor:=dbms_sql.open_cursor; dbms_sql.parse(v_cursor,sql_string,dbms_sql.v7); v_numrows:=dbms_sql.execute(v_cursor); dbms_sql.close_cursor(v_cursor); end; 则可以 sql>exec my_execute(’select * from tab’); sql>exec my_execute(’insert into test value’||’(’||’’’ddd’’’||’)’); sql>exec my_execute(’commit’); 对于查询方面的可以如下方式: 比如想用游标查询一个表,但是这个表是分月的,每个月可能表名都会改变。 create or replace procedure proc_test as v_curid integer; v_result integer; v_strSql varchar2(255); v_userid okcai.userid%type; v_username okcai.username%type; begin v_strSql := ’select * from okcai_’||to_char(sysdate,’yyyymm’); v_curid := dbms_sql.open_cursor; dbms_sql.parse(v_curid,v_strSql,dbms_sql.v7); dbms_sql.define_column(v_curid,1,v_userid); dbms_sql.define_column(v_curid,2,v_username,10); --必须指定大小 v_result := dbms_sql.execute(v_curid); loop if dbms_sql.fetch_rows(v_curid) = 0 then exit; --没有了 ,退出循环 end if; dbms_sql.column_value(v_curid,1,v_userid); dbms_sql.column_value(v_curid,2,v_username); dbms_output.put_line(v_userid); dbms_output.put_line(v_username); end loop; dbms_sql.close(v_curid); end; 4、用EXECUTE IMMEDIATE <1>. 在PL/SQL运行DDL语句 begin execute immediate ’set role all’; end; <2>. 给动态语句传值(USING 子句) declare l_depnam varchar2(20) := ’testing’; l_loc varchar2(10) := ’Dubai’; begin execute immediate ’insert into dept values (:1, :2, :3)’ using 50, l_depnam, l_loc; commit; end; <3>. 从动态语句检索值(INTO子句) declare l_cnt varchar2(20); begin execute immediate ’select count(1) from emp’ into l_cnt; dbms_output.put_line(l_cnt); end; <4>. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.?认为IN类型,其它类型必须显式指定 declare l_routin varchar2(100) := ’gen2161.get_rowcnt’; l_tblnam varchar2(20) := ’emp’; l_cnt number; l_status varchar2(200); begin execute immediate ’begin ’ || l_routin || ’(:2, :3, :4); end;’ using in l_tblnam, out l_cnt, in out l_status; if l_status != ’OK’ then dbms_output.put_line(’error’); end if; end; <5>. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量 declare type empdtlrec is record (empno number(4), ename varchar2(20), deptno number(2)); empdtl empdtlrec; begin execute immediate ’select empno, ename, deptno ’ || ’from emp where empno = 7Array34’ into empdtl; end; <6>. 传递并检索值.INTO子句用在USING子句前 declare l_dept pls_integer := 20; l_nam varchar2(20); l_loc varchar2(20); begin execute immediate ’select dname, loc from dept where deptno = :1’ into l_nam, l_loc using l_dept ; end; <7>. 多行查询选项.对此选项用insert语句填充临时表,用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾. declare l_sal pls_integer := 2000; begin execute immediate ’insert into temp(empno, ename) ’ || ’ select empno, ename from emp ’ || ’ where sal > :1’ using l_sal; commit; end; <8>. 完成update的returning功能 update可以用returning返回修改以后的值。比如: UPDATE employees SET job_id =’SA_MAN’, salary = salary + 1000, department_id = 140 WHERE last_name = ’Jones’ RETURNING salary*0.25, last_name, department_id INTO :bnd1, :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’); Array、触发器 查看触发器 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 1ArrayArray3, 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到-20ArrayArrayArray,错误信息最大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;
相关推荐
### PL/SQL编程基础知识 #### 一、PL/SQL简介 PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库...
pl/sql编程基础教程,内容丰富,适合初学者学习。
【PL/SQL编程】是Oracle数据库中用于数据库管理和应用程序开发的一种高级过程语言,它结合了SQL查询语言的威力和高级编程语言的灵活性。本章详细介绍了PL/SQL的基础知识,帮助初学者快速掌握该语言。 **4.1 PL/SQL...
Oracle PL/SQL编程是Oracle数据库管理系统中的重要组成部分,它是一种过程化语言,允许开发者编写复杂的数据库应用程序。在本次实验中,我们将重点学习PL/SQL的基本语法、控制结构、复合数据类型以及异常处理技术。 ...
PL/SQL编程教程电子书,全册,完整版。。。。
### Oracle PL/SQL编程知识点详解 #### 一、SQL与PL/SQL概述 - **SQL简介**:SQL(Structured Query Language)即结构化查询语言,是数据库管理领域中最广泛使用的标准化语言之一。由IBM最初提出并发展起来,后被...
创建和应用包是PL/SQL编程中的一项重要内容,它不仅有助于封装和重用代码,还能够提高代码的安全性和可维护性。包可以定义过程和函数,还可以包含变量、常量和异常等其他对象。 PL/SQL中的触发器可以分为DML触发器...
Oracle PL/SQL 编程及最佳实践 Oracle PL/SQL 是一种高级编程语言,用于开发 Oracle 数据库中的存储过程、函数和触发器。PL/SQL language 提供了强大的编程能力,可以实现复杂的业务逻辑,并且与 Oracle 数据库紧密...
PL/SOL是Oracle特有的编程语言,它不仅具有过程编程语言的基本特征(循环、条件分支等),而且还...本书不仅适合于PL/SQL初学者,而且也适合于有经验的PL/SQL编程人员,本书还可以作为Oracle培训班的教材或者辅助材料。
《Oracle Database 10g PL/SQL编程》一书由Scott Urman、Ron Hardman和Michael McLaughlin共同编写,由McGraw-Hill/Osborne出版,是Oracle数据库编程领域的一部经典之作。该书深入浅出地介绍了Oracle Database 10g...
Oracle PL/SQL编程是Oracle数据库系统中的一个核心组成部分,它扩展了SQL的语法,使得数据库管理及应用程序开发更具灵活性和可编程性。PL/SQL融合了SQL查询和控制流语句,提供了处理复杂业务逻辑的能力。 PL/SQL的...
Oracle PL/SQL编程是Oracle数据库系统中的一个关键组成部分,它是一种强大的过程化编程语言,用于在数据库中执行复杂的逻辑和操作。本指南旨在为初学者提供一个基础的PL/SQL编程入门,帮助他们理解并掌握这个强大的...
### Oracle 实验五 PL/SQL编程 #### 实验目的 本次实验旨在使学习者深入了解PL/SQL编程的基础知识与实际应用。具体目标包括: 1. **掌握PL/SQL的数据类型和基本语法**:理解PL/SQL中不同数据类型的定义与使用方法...
本书《精通Oracle10g PL/SQL编程》为读者提供了一个系统性的学习路径,从基础知识到高级应用,从具体技巧到最佳实践,涵盖了PL/SQL编程的方方面面。通过本书的学习,读者将能够有效地提高Oracle数据库编程的效率和...
《精通Oracle 10g PL/SQL编程》是一本专门针对Oracle 10g版本的PL/SQL编程语言的权威指南书籍。Oracle 10g是甲骨文公司(Oracle Corporation)推出的数据库管理系统(DBMS)的一个重要版本,而PL/SQL是Oracle的存储...
Oracle PL/SQL编程详解是Oracle数据库开发人员必须掌握的技术之一。Oracle PL/SQL是一种用于Oracle数据库系统的程序设计语言,它是SQL语言的扩展,包含了许多能增加程序可读性和模块化的特性。PL/SQL代码被编译成...
根据提供的文件信息,以下是对Oracle 11g PL/SQL编程知识点的详细说明: 标题中的“Oracle 11g PL/SQL编程”指出了文档的主旨,即介绍Oracle数据库的第11g版本中PL/SQL(过程式SQL)编程的技术细节和实践应用。PL/...