


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
对一个表名和字段都是变量进行创建的代码是:create or replace procedure TEST2(tab in varchar2,mid in varchar2,mname in varchar2,age in number) as begin execute immediate insert into |tab| values(|mid|,|mname|,|age|); end TEST2;如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句,但这个动态语句中带参数,或 Select 的结果要 into 到变量中时就要稍加留心一下了。而在 8i 以前的版本(谁还用这么古老的玩艺,总有些不得已的地方,老系统考虑升级成本遗留下来的,应用软件所伴随着的等),都没法用 execute immediate,就得使用 DBMS_SQL 包来实现了何谓动态 SQL 和 DDL 语句呢?通常在过程中要操作的表名、字段名都必须是明确的,否则编译过程时就要报错,但如果这两者也用变量名来表示就是动态的。DDL 就是数据库对象定义的操作,如 CREATE TABLE/VIEW/INDEX/SYN/CLUSTER,及这些对象的删除、修改操作等等。比如在 Oracle 中有执行下面过程块的意图时,就要使用到 execute immediate 或是 DBMS_SQL 包了。当然下面的语句块是通不过的。declarecol_name varchar2(30) := name; -假定表user存在name字段col_val varchar2(30);beginselect col_name into col_val -按照惯常思维,可能就会这么写from user where age between 18 and 25; -编译时会提示列名不存在的drop table t2; -不能直接执行 DDL 语句,后面查询 t2 编译器就无能为力了end;现在我们提出对上面问题的解,针对第一个 Select 语句来说明,并假设查询中还带有参数。块中的 DDL 也是类似的解法。例子因力图涵盖更多内容,所以稍显复杂,如果不需要 into (如 update/delete 语句),或者不带参数,会简单多了,应不难简化。有两种处理方法,以 8i 为分水岭。1. Oracle 8i 及以上版本的过程中处理动态 SQL 语句的办法declarev_col_name varchar2(30) := name; -字段名 name 用变量来表示v_user_name varchar2(30); -用户名称v_user_age integer; -用户年龄v_sql_str varchar2(500); -动态 SQL 语句beginv_sql_str := select |v_col_name|,age from users -字段名后面不能紧随 into 到变量了where age between :start_age and :end_age and rownum=1; -两个命名参数-用 execute immediate 动态执行 SQL 语句-注意其后的 into 字段值到变量的写法,还有 using 来代入参数execute immediate v_sql_str into v_user_name,v_user_age using 18,25;dbms_output.put_line(第一个符合条件的用户:|v_user_name|,年龄:|v_user_age);end;除此之外,在 Oracle 8i 及以上版本中,还能用 DBMS_UTILITY.EXEC_DDL_STATEMENT(ddl_sql_str) 执行 DDL 语句。 下面是我写的一个简单的存储过程:CREATE OR REPLACE PROCEDURE test1asBEGINexecute immediate DROP TABLE newtest;execute immediate CREATE TABLE newtest AS SELECT aaa as a, bbb as b FROM table1dblink;END test1; 就是这么个简单的存储过程,先删除本地的表,然后从远程数据库中读取后动态创建到本地。终于找到毛病了,原来是没有权限。虽然当前用户执行语句是有权限的,但是放到存储过程中就必须要显式的赋个权限给当前用户。以下是我找到的资料,贴出来给大家也看一下吧。=【IT168 技术文档】我们知道,用户拥有的role权限在存储过程是不可用的。如: SQL select * from dba_role_privs where grantee=SUK; GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE - - - - SUK DBA NO YES SUK CONNECT NO YES SUK RESOURCE NO YES -用户SUK拥有DBA这个role -再创建一个测试存储过程: create or replace procedure p_create_table is begin Execute Immediate create table create_table(id int); end p_create_table; -然后测试 SQL exec p_create_table; begin p_create_table; end; ORA-01031: 权限不足 ORA-06512: 在SUK.P_CREATE_TABLE, line 3 ORA-06512: 在line 1 -可以看到,即使拥有DBA role,也不能创建表。role在存储过程中不可用。 -遇到这种情况,我们一般需要显式进行系统权限,如grant create table to suk; -但这种方法太麻烦,有时候可能需要进行非常多的授权才能执行存储过程 -实际上,oracle给我们提供了在存储过程中使用role权限的方法: -修改存储过程,加入Authid Current_User时存储过程可以使用role权限。 create or replace procedure p_create_table Authid Current_User is begin Execute Imm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 月季养护知识培训内容课件
- 崇州建筑维修方案设计招聘(3篇)
- 陈曦建筑方案设计(3篇)
- 月子里美容护肤知识培训
- 团队管理与个人绩效提升训练方案
- 2025年学历类自考专业(护理)外科护理学(一)-护理学基础参考题库含答案解析(5套)
- 施工机械设备配置及调度实施方案
- 总包管理服务方案及实施流程详解
- 2025年智慧物流园区资金申请项目区域协同与产业链优化报告
- 2025年学历类自考专业(工商企业管理)管理学原理-国际贸易理论与实务参考题库含答案解析(5套)
- 如果历史是一群喵
- 数据安全重要数据风险评估报告
- 四害消杀培训
- 伐木工安全培训
- 旅游业行业中层管理人员培训方案
- LED外贸英语入门
- 2024年白酒酿造职业技能等级认定(初级工)理论考试复习题库(含答案)
- 自助餐食品安全培训
- 机械图纸识别(修订版)
- 2024年湖北邮政集团招聘笔试参考题库附带答案详解
- 循证护理实践案例比赛课件
评论
0/150
提交评论