如何创建变量表名

上传人:mg****85 文档编号:34437846 上传时间:2018-02-24 格式:DOC 页数:3 大小:25.50KB
返回 下载 相关 举报
如何创建变量表名_第1页
第1页 / 共3页
如何创建变量表名_第2页
第2页 / 共3页
如何创建变量表名_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《如何创建变量表名》由会员分享,可在线阅读,更多相关《如何创建变量表名(3页珍藏版)》请在金锄头文库上搜索。

1、对一个表名和字段都是变量进行创建的代码是: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 语句,但这个动态语句中带参

2、数,或 Select 的结果要 into 到变量中时就要稍加留心一下了。而在 8i 以前的版本(谁还用这么古老的玩艺,总有些不得已的地方,老系统考虑升级成本遗留下来的,应用软件所伴随着的等) ,都没法用 execute immediate,就得使用 DBMS_SQL 包来实现了何谓动态 SQL 和 DDL 语句呢?通常在过程中要操作的表名、字段名都必须是明确的,否则编译过程时就要报错,但如果这两者也用变量名来表示就是动态的。DDL 就是数据库对象定义的操作,如 CREATE TABLE/VIEW/INDEX/SYN/CLUSTER,及这些对象的删除、修改操作等等。比如在 Oracle 中有执行

3、下面过程块的意图时,就要使用到 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;现在我们提出对上

4、面问题的解,针对第一个 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

5、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; db

6、ms_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,

7、 bbb as b FROM table1dblink;END test1; 就是这么个简单的存储过程,先删除本地的表,然后从远程数据库中读取后动态创建到本地。终于找到毛病了,原来是没有权限。虽然当前用户执行语句是有权限的,但是放到存储过程中就必须要显式的赋个权限给当前用户。以下是我找到的资料,贴出来给大家也看一下吧。=【IT168 技术文档】我们知道,用户拥有的 role权限在存储过程是不可用的。如: SQL select * from dba_role_privs where grantee=SUK;GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROL

8、E- - - -SUK DBA NO YESSUK CONNECT NO YESSUK RESOURCE NO YES-用户 SUK拥有 DBA这个 role-再创建一个测试存储过程:create or replace procedure p_create_table isbeginExecute 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.

9、P_CREATE_TABLE, line 3ORA-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 isbeginExecute Immediate create table create_table(id int);end p_create_table;-再尝试执行:SQL exec p_create_table;PL/SQL procedure successfully completed-已经可以执行了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号