完成批量修改user_tables中的所有表的栏位名(从MS SQL导入过来,发现大小写问题,造成很多麻烦)
存储过程见下:

  1. -- Created on 2012/3/14 by FREE
  2. declare
  3. -- Local variables here
  4. Cursor tbl_cur is select table_name from user_tables;
  5. --col_cur Cursor;
  6. i integer;
  7. tbl_name varchar2(50);
  8. col_name varchar2(50);
  9. begin
  10. -- Test statements here
  11. for tbl_name in tbl_cur LOOP
  12. for col_cur in (select COLUMN_NAME from all_tab_columns where table_name=tbl_name.table_name) LOOP
  13. dbms_output.put_line('alter table '||tbl_name.table_name||' rename column "'||col_cur.column_name||'" to '||col_cur.column_name);
  14. end LOOP;
  15. end LOOP;
  16. end;

(从以下转载文章中收获很多,谢谢作者。转自:http://hi.baidu.com/wang90627/blog/item/394e7d019d57329ce850cd5d.html)
创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限。该权限可由系统管理员授予。创建一个存储过程的基本语句如下:

  1. CREATE [OR REPLACE] PROCEDURE 存储过程名
  2.  
  3. [(参数[IN|OUT|IN OUT]数据类型…)]
  4.  
  5. {AS|IS}
  6.  
  7. [说明部分]
  8.  
  9. BEGIN
  10.  
  11. 可执行部分
  12.  
  13. [EXCEPTION
  14.  
  15. 错误处理部分]
  16.  
  17. END [过程名];

其中:

可选关键字OR REPLACE表示如果存储过程已经存在,则用新的存储过程覆盖,通常用于存储过程的重建。

参数部分用于定义多个参数(如果没有参数,就可以省略)。参数有三种形式:IN、OUT和IN OUT。如果没有指明参数的形式,则默认为IN。

关键字AS也可以写成IS,后跟过程的说明部分,可以在此定义过程的局部变量。

编写存储过程可以使用任何文本编辑器或直接在SQL *Plus环境下进行,编写好的存储过程必须要在SQL *Plus环境下进行编译,生成编译代码,原代码和编译代码在编译过程中都会被存入数据库。编译成功的存储过程就可以在Oracle环境下进行调用了。

一个存储过程在不需要时可以删除。删除存储过程的人是过程的创建者或者拥有DROP ANY PROCEDURE系统权限的人。删除存储过程的语法如下:

DROP PROCEDURE 存储过程名;

如果要重新编译一个存储过程,则只能是过程的创建者或者拥有ALTER ANY PROCEDURE系统权限的人。语法如下:

ALTER PROCEDURE 存储过程名 COMPILE;

执行(或调用)存储过程的人是过程的创建者或是拥有EXECUTE ANY PROCEDURE系统权限的人或是被拥有者授予EXECUTE权限的人。执行的方法如下:

方法1:

EXECUTE 模式名.存储过程名[(参数…)];

方法2:

BEGIN

模式名.存储过程名 [(参数…)];

END;

传递的参数必须与定义的参数类型、个数和顺序一致(如果参数定义了默认值,则调用时可以省略参数)。参数可以是变量、常量或表达式,用法参见下一节。

如果是调用本账户下的存储过程,则模式名可以省略。要调用其他账户编写的存储过程,则模式名必须要添加。

下面是我自己的实验:

注:游标可以“显式”声明,也可以“隐式”声明。“隐式”声明的意思是,不用声明游标,在for循环中直接用游标的record就行。例一是内外
层循环游标都是“隐式”声明的情况(内层循环的游标,需要用到外层循环的游标值,所以不能两个游标都在第一个循环外声明)。(一般:游标名是
xxx__cursor,游标中的每行记录名是xxx_record
。并且,内层循环要用游标,内层的游标应该要用“隐式”声明,外层游标可用可不用。)

例一:

  1. CREATE OR REPLACE PROCEDUREmain_mx
  2. AS
  3. BEGIN
  4. FOR mainout_recordIN( SELECT /*这里的mainout_record直接是游标的每行记录了。另外IN后面如果是select语句,就要加括号,并且select语句结束不用;结尾,IN后面如果是游标名,就不要括号*/ ID,smscontent,allcode,cjr,pretongdaoid,clientid,shr,pretime,cjsj,shstatus,shsj
  5.  
  6. from t_busi_main_presend
  7.  
  8. where shstatus in('','') and klstatus='') LOOP
  9. /* insert into T_BUSI_PRESEND_MX*/
  10. /* CURSOR mainmobile_cursor IS
  11. SELECT * FROM TABLE(fn_split(mainout_record.allcode,',')); */
  12.  
  13. FOR mainmobile_record IN (SELECT column_value cv FROM TABLE(fn_split(mainout_record.allcode,','))) LOOP /*SELECT column_value cv FROM TABLE(fn_split(mainout_record.allcode,','),这句话是执行fn_split这个函数,函数功能类似java中的split功能,但是oracle本身没有这个函数,所以要自己写,代码是我在网上拷的,注意因为mainout_record.allcode这个记录集就只有“一列”记录,allcode是外层游标查出来的一个列名,所以前面是selectcolumn_value,后面打印值的时候也是写.column_value:
  14.  
  15. 功能描述:用指定分隔符切割输入的字符串,返回一维数组,每个数组元素为一个子串。
  16.  
  17. 先:
  18.  
  19. CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
  20.  
  21. 再:
  22.  
  23. CREATE OR REPLACE FUNCTION fn_split(p_str IN CLOB, p_delimiter IN VARCHAR2)
  24. RETURN ty_str_split
  25. IS
  26. j INT := 0;
  27. i INT := 1;
  28. len INT := 0;
  29. len1 INT := 0;
  30. str VARCHAR2 (4000);
  31. str_split ty_str_split := ty_str_split ();
  32. BEGIN
  33. len := LENGTH (p_str);
  34. len1 := LENGTH (p_delimiter);
  35.  
  36. WHILE j < len
  37. LOOP
  38. j := INSTR (p_str, p_delimiter, i);
  39.  
  40. IF j = 0
  41. THEN
  42. j := len;
  43. str := SUBSTR (p_str, i);
  44. str_split.EXTEND;
  45. str_split (str_split.COUNT) := str;
  46.  
  47. IF i >= len
  48. THEN
  49. EXIT;
  50. END IF;
  51. ELSE
  52. str := SUBSTR (p_str, i, j - i);
  53. i := j + len1;
  54. str_split.EXTEND;
  55. str_split (str_split.COUNT) := str;
  56. END IF;
  57. END LOOP;
  58.  
  59. RETURN str_split;
  60. END fn_split;
  61.  
  62. */
  63. DBMS_OUTPUT.PUT_LINE(mainmobile_record.cv);/*打印结果的时候,直接反键存储过程名-->测试有时是出不来结果的,这时应该"新建"-->"命令窗口"--SQL>set serveroutput on -->execute main_mx(这是存储过程名),这样才能打印结果 */
  64. END LOOP;
  65. END LOOP;
  66. END;

例二(外层for循环游标是“显式”声明):

  1. CREATE OR REPLACE PROCEDUREmain_mx_1
  2. as
  3. CURSOR mainout_cursor IS SELECT ID,smscontent,allcode,cjr,pretongdaoid,clientid,shr,pretime,cjsj,shstatus,shsj from t_busi_main_presend where shstatus in('','') and klstatus='';
  4. begin
  5. FOR mainout_record IN mainout_cursor LOOP
  6. /* insert into T_BUSI_PRESEND_MX*/
  7.  
  8. /* CURSOR mainmobile_cursor IS
  9. SELECT * FROM TABLE(fn_split(mainout_record.allcode,','));
  10. BEGIN*/
  11. FOR mainmobile_record IN (SELECT column_value cv FROM TABLE(fn_split(mainout_record.allcode,','))) LOOP
  12. DBMS_OUTPUT.PUT_LINE(mainmobile_record.cv);
  13. END LOOP;
  14.  
  15. END LOOP;
  16.  
  17. END;

oracle游标循环的嵌套的更多相关文章

  1. Oracle游标-循环查询表中数据(表名),并执行

    Oralce 表中存有一个字段,该字段存储表名,要把该表中的所有表名查询出来(即表名结果集),且执行结果集from 表名结果集: declare v_ccount ); --定义一个游标变量 curs ...

  2. Oracle游标循环更新数据案例

    declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZ ...

  3. 21. oracle游标循环例子

    事例1: create or replace procedure sp_addProjectQj( ret out number, flowid in number --流程Id) ascursor ...

  4. oracle for loop循环以及游标循环

    1. for in loop形式 DECLARE    CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salar ...

  5. Oracle游标介绍

    Oracle游标使用详解: 游标: 用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标.要在程序中使用游标,必须 ...

  6. Oracle 游标

    游标的简介 游标的概念 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作 ...

  7. Oracle 游标示例,带异常处理

    Oracle游标示例一则,带异常处理. DECLARE CURSOR c_dl IS SELECT ID, NSRSBH, WSPZXH, ZXYY_DM, HZRQ, SWJG_DM, GXSJ F ...

  8. Oracle 游标使用(转)

    这个文档几乎包含了oracle游标使用的方方面面,全部通过了测试 ; ; dbms_output.put_line(sql) loop dbms_output.put_line( ; ; ; r_te ...

  9. Oracle 游标使用全解(转)

    转自:http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html 这个文档几乎包含了oracle游标使用的方方面面,全部通过了测试 -- ...

随机推荐

  1. Linux信号量详解

    1.什么是信号量信号量是一种特殊的变量,访问具有原子性.只允许对它进行两个操作:1)等待信号量当信号量值为0时,程序等待:当信号量值大于0时,信号量减1,程序继续运行.2)发送信号量将信号量值加1. ...

  2. hibernate--HQL语法与详细解释

    HQL查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此 Hi ...

  3. 【转】弹出可拖动的DIV层提示窗口

    来源:www.divcss5.com <html> <head> <meta http-equiv="Content-Type" content=&q ...

  4. OpenJudge计算概论-分配病房

    /*===================================== 分配病房 总时间限制: 1000ms 内存限制: 65536kB 描述 某个科室的病房分为重症和普通,只有当病人的疾病严 ...

  5. 文件/文件夹比较工具 beyond compare 3.3.10

  6. ORALCE 游标简单的实例

    --取简单的游标 declare cursor sp is select * from user_tables; myrecord user_tables%ROWTYPE; begin open sp ...

  7. R提高篇(三): 数据管理一

    目录: 创建新变量 变量重编码 日期值 数据排序 数据集合并 数据子集 随机取样 创建新变量 算术运算函数:x%%y [求余 x mod y,  5%%2的结果为1], x%/%y  [整数除法,5% ...

  8. Android.mk文件语法规范 原文

    序言:------------- 此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C++源文件.为了明白下面的内容,你必须已经阅读 ...

  9. (转载)CentOS6下 源代码方式安装openERP7.0

    CentOS6下 源代码方式安装openERP7.0 安装背景 :CPU32 bit,CentOS 6.4版本,openERP7.0,linux shell为bash,PostgreSQL9.2 1. ...

  10. WIN8外包公司【经验分享】——升级WIN8.1后VS2012报错解决方法

    今天升级WIN8.1的时候发现VS2012不能正常工作,原来的Silverlight项目也无法正常打开了,这是WIN8.1升级产生的bug. 得知微软提供了VISUAL STUDIO 2012 UPD ...