Oracle关于创建存储过程权限问题以及带参数的游标的范例
来源:互联网 发布:少女时代930事件知乎 编辑:程序博客网 时间:2024/06/06 19:21
由于公司的项目需要,创建了一个关于对表的字段动态增加的存储过程,用到了游标,带参数的游标,解决存储过程执行权限问题: AUTHID CURRENT_USER,看下面的代码:
create or replace procedure YS_CWYS_YSFZPZ(DIRCODE varchar2) AUTHID CURRENT_USER as/*********************************名称:YS_CWYS_YSFZPZ功能描述:修改财务预算配置表参数:财务预算分类的CODE修订记录:版本号 编辑时间 编辑人 修改描述1.0.0 2016-3-28 XXX 1.创建此存储过程存储过程执行权限问题: AUTHID CURRENT_USER入参出参描述:DIRCODE 财务预算分类的编码**********************************/ v_tablename varchar2(30);--表名 v_tableselect_sql varchar(200);--查询表名的SQL v_table_bakname varchar2(40); --备份表的表名 v_tablebak_sql varchar(200);--对表进行备份数据的SQL v_droptable_sql varchar(200); --删除表的sql v_column varchar(20); --字段别名 v_column_sql varchar(200);--拼装SQL v_column_name varchar(200);--中间变量 v_createtable_sql varchar(1000);--创建新表的SQL v_inserttable_sql varchar(1000);--插入数据的SQL v_createtablebak_sql varchar(1000);--创建备份表的SQL v_droptablebak_sql varchar(200);--删除备份表 i number; v_cloumncount_sql varchar(200);--统计字段总数SQL v_cloumn_count number;--统计字段总数 v_alerttable_sql varchar(200); -- 设置主键begin v_column_sql:=''; v_cloumn_count:=0; --通过CODE查询表名 v_tableselect_sql:= 'SELECT TABLENAME FROM ys_financialbudgetdir WHERE DIRCODE = '|| DIRCODE; execute immediate v_tableselect_sql into v_tablename; v_tablename:=UPPER(v_tablename); v_table_bakname:= v_tablename ||'BAK'; v_tablebak_sql:=' INSERT INTO ' || v_table_bakname || ' SELECT * FROM ' ||v_tablename; --执行备份 execute immediate v_tablebak_sql; v_droptable_sql:='DROP TABLE '|| v_tablename; --删除原有的表 execute immediate v_droptable_sql; v_createtable_sql:= 'CREATE TABLE '|| v_tablename || '(ID NUMBER(8) NOT NULL, TYPE CHAR(2),'; v_createtablebak_sql:= 'CREATE TABLE '|| v_table_bakname || '(ID NUMBER(8) NOT NULL, TYPE CHAR(2),'; --定义配置表游标 DECLARE CURSOR cwpz_Cusor(C_DIRCODE VARCHAR2) IS SELECT CLOUMN FROM YS_FINANCIALCONFIG WHERE ISLEAF='1' and dircode = C_DIRCODE ; --开始使用游标取数据 BEGIN OPEN cwpz_Cusor(DIRCODE); LOOP FETCH cwpz_Cusor INTO v_column; --游标取不到数据则退出 EXIT WHEN cwpz_Cusor%NOTFOUND; v_column_sql:= v_column_sql || v_column || ' VARCHAR2(200),'; END LOOP; CLOSE cwpz_Cusor; END; v_createtable_sql:= v_createtable_sql || v_column_sql || ' orgid NUMBER(8),year VARCHAR2(4),bscs NUMBER(8), bsqj VARCHAR2(100),dirid NUMBER(8), parentid NUMBER(8) )'; v_createtablebak_sql:= v_createtablebak_sql || v_column_sql || ' orgid NUMBER(8),year VARCHAR2(4),bscs NUMBER(8), bsqj VARCHAR2(100),dirid NUMBER(8), parentid NUMBER(8) )'; --创建表 execute immediate v_createtable_sql; --指定主键 v_alerttable_sql:= 'ALTER TABLE '||v_tablename||' ADD CONSTRAINT '||' PK_'||v_tablename ||' primary key (ID)'; execute immediate v_alerttable_sql; --清空 v_column_sql:=''; --统计总数 v_cloumncount_sql:='SELECT count(column_name) count_num FROM user_tab_columns WHERE table_name ='''|| v_table_bakname||''''; execute immediate v_cloumncount_sql into v_cloumn_count; v_inserttable_sql:= 'INSERT INTO ' || v_tablename || ' ('; i:=0; --定义备份表游标 DECLARE CURSOR cwys_Cusor(C_TABLENAME VARCHAR2) IS SELECT column_name FROM user_tab_columns WHERE table_name = C_TABLENAME ; --开始使用游标取数据 BEGIN OPEN cwys_Cusor(v_table_bakname); LOOP i:=i+1; FETCH cwys_Cusor INTO v_column_name; --游标取不到数据则退出 EXIT WHEN cwys_Cusor%NOTFOUND; if i=v_cloumn_count then v_column_sql:= v_column_sql|| v_column_name; else v_column_sql:= v_column_sql|| v_column_name || ','; end if; END LOOP; CLOSE cwys_Cusor; END; v_inserttable_sql:= v_inserttable_sql || v_column_sql|| ') SELECT '||v_column_sql|| ' FROM '|| v_table_bakname; dbms_output.put_line(v_inserttable_sql); execute immediate v_inserttable_sql; --删除备份表 v_droptablebak_sql:= 'DROP TABLE ' ||v_table_bakname; execute immediate v_droptablebak_sql; --创建备份表 execute immediate v_createtablebak_sql; EXCEPTION WHEN OTHERS THEN --strErr := substr(sqlerrm,1,100); ROLLBACK;END YS_CWYS_YSFZPZ;
1 0
- Oracle关于创建存储过程权限问题以及带参数的游标的范例
- oracle带游标的存储过程
- 在java的hibernate3框架中调用oracle数据库中带游标参数的存储过程
- hibernate里使用jdbc方式调用oracle带游标返回参数的简单分页存储过程
- JAVA调用ORACLE带数组输入参数和返回游标结果集的存储过程
- oracle存储过程中游标的使用(包括带参数的游标)
- 带游标的存储过程
- 带游标的存储过程
- SQLSERVER存储过程如何写带参数的游标
- SQLSERVER存储过程如何写带参数的游标
- 如何创建带参数的存储过程
- oracle带参数的游标
- Oracle 嵌套游标、带参数的游标
- oracle带参数的存储过程
- Oracle带输入输出参数的存储过程
- Oracle带参数的存储过程
- VBA调用带游标返回值的ORACLE存储过程
- oracle中带游标的存储过程示例
- xml和代码实现Animation
- 有关linux下redis overcommit_memory的问题
- 简单了解一下--谓词(NSPredicate)
- iOS打包pod spec
- 自定义弹出提示框
- Oracle关于创建存储过程权限问题以及带参数的游标的范例
- 用PL/SQL导出SQL语句
- java 通配符解惑
- linux下的文件服务器[ftp(ftp/tftp)、 Samba、NFS服务器
- find指令详解
- css3小知识点收录
- 关于c++中cin获取字符串的某些问题
- 转载-JAVA并发多线程
- C#关闭后台进程