


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
对一个表名和字段都是变量进行创建的代码是: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025内蒙古巴彦淖尔市临河区第三人民医院招聘部分人员3人模拟试卷及答案详解(典优)
- 2025广东韶关市新丰县应急管理局招聘综合应急救援大队队员5人考前自测高频考点模拟试题及参考答案详解
- 2025安徽蚌埠市五河县乡村医生“乡聘村用”招聘30人模拟试卷完整答案详解
- 2025广西百色市凌云县新活力劳务有限责任公司工作人员招聘8人模拟试卷及答案详解(必刷)
- 2025年莆田市市级机关公开遴选考试真题
- 2025年长江工程职业技术学院人才引进24人模拟试卷及参考答案详解
- 2025年甘肃省武威市事业单位招聘628人【医疗岗57人】考前自测高频考点模拟试题及一套参考答案详解
- 2025年浸渗胶项目合作计划书
- 2025贵州遵义医科大学第二附属医院第十三届贵州人才博览会引才17人模拟试卷及答案详解参考
- 2025贵州贵阳市某单位派遣制员工模拟试卷附答案详解(完整版)
- 中职历史说课课件
- 遥感科学与技术课件
- 尿量的观察及护理
- 2025年4月自考00840第二外语(日语)试题
- 社交媒体焦虑成因-洞察及研究
- 2025年高速公路扩建施工合同
- 医疗设备维护的智慧运营实践
- 2025-2030中国环丁砜行业市场现状分析及竞争格局与投资发展研究报告
- 一级注册消防工程师高频真题含答案2024
- 生产运营销售管理优化项目销售预测优化设计方案
- 完整的离婚协议书打印电子版(2025年版)
评论
0/150
提交评论