上面的Create Table语句出错,该怎么修改?
解决方案 »
- 简单的UPDATE!
- 数据库导出报错问题……100分求解
- 获取ODBC的所有用户表失败,高手看看是不是.NET2的BUG?
- 急,如何实现两台机器两个数据库的自动刷新?
- 捕获DML语句出错:ora_sql_txt(sql_text)为空
- ORACLE内部培训视频教学22讲 下载,人越多越快说,用的是bt.
- linux下的oracle操作
- 又要签名了。各位来签名!
- Oracle的select 语句中可不可以使用在from子句中使用别名的?
- 据类型为number(15,5)浮点型,要求做到保密,怎么办?
- 想采用热联机的方式备份数据库,可是老是提示:只有在应用程序已经连接到OMS的情况下才能启动本向导,请问我该怎么办?
- ORACLE8I中包有什么用处?怎么用?和存储过程有什么关系吗?
create or replace function test return varchar2 as
v_cursor number;
v_string varchar2(200);
v_row number;
begin
v_cursor:=dbms_sql.open_cursor;
--v_string:='update fnd_user a set a.description=''丁亚军'' where a.user_id=1055';
v_string:='create table testdb (text varchar2(200))';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor);
return ('成功执行');
exception
when others then
dbms_sql.close_cursor(v_cursor);
return ('执行失败!'||sqlcode||sqlerrm);
raise;
end;
------------------------
俺现在才知道你的大名是:丁亚军啊。hehe续上面的,问你一个问题:
在oracle中如何进行字符串连接呢?假设:
v_string varchar2(500);
这里v_string 是一个存储过程的参数,这样连接: v_string:=' Create Table '+TableName+'( TelNo varchar2(20),
constraint idx_This primary key(TelNo))'; 不对,程序执行到这就发生异常了。怎么改?
constraint idx_This primary key(TelNo))';TableName 是一个存储过程的输入参数。
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
是不是创建的本地表dbms_sql.native? 如果要在服务器上创建表该怎么办?
sql 语句:
select count(*) from all_tables a where a.table_name = 'TempCmpTable' ;如果我要查看的表名是一个输入参数,那么这个sql语句怎么写?
TableName in varchar2(20)
用:
select count(*) from all_tables a where a.table_name = TableName ;好像即使表存在也返回0 ,怎么引用参数呢?
v_cursor number;
v_string varchar2(200);
v_row number;
begin
v_cursor:=dbms_sql.open_cursor;
--v_string:='update fnd_user a set a.description=''丁亚军'' where a.user_id=1055';
v_string:='create table testdb (text varchar2(200))';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor);
return ('成功执行');
exception
when others then
dbms_sql.close_cursor(v_cursor);
return ('执行失败!'||sqlcode||sqlerrm);
raise;
end;
------------------------------------
晕,我使用你上面的方法新建表,怎么总是建立不了?你自己可以测试一下吗?但是截断表禾删除表用你上面的方法却可以的。
select count(*) from all_tables a where a.table_name :=TableName;
--你给int型变量赋值直接: RetValue=1;
--创建表部分使用execute immediate 'create table......';
存储过程功能:判断一个表是否存在,如果不存在就新建表;如果存在,就先截断表,然后删除表,最后新建一个表。CREATE OR REPLACE PROCEDURE ExCreate
(
TableName varchar2,
RetValue out int
)
as
i int;
v_cursor number;
v_string varchar2(500);
v_row number;
begin
select count(*) into i from all_tables a where a.table_name = TableName ;
if i=0 then
begin
RetValue:=1;
/* ---这个创建也可以
execute immediate 'create table testdbex (text varchar2(200))';
-- commit; */
/* -- 这样创建也可以
v_cursor:=dbms_sql.open_cursor;
v_string:='create table testdb (text varchar2(200))';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor); */
-- 我的程序中是这样创建的
v_cursor:=dbms_sql.open_cursor;
--v_string:=' Create Table ' || TableName ||' ( TelNo varchar2(20),constraint idx_This_ex primary key(TelNo))';
v_string := 'Create Table TempCmpTable( TelNo varchar2(20),constraint idx_number primary key(TelNo))';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor);
RetValue :=100;
end;
else
begin
RetValue:=2;
v_cursor:=dbms_sql.open_cursor;
v_string:='truncate table ' || TableName;--||';';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor); RetValue :=3;
v_cursor:=dbms_sql.open_cursor;
v_string:=' drop table ' || TableName;--|| ';';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor); RetValue :=4;
v_cursor:=dbms_sql.open_cursor;
v_string:='Create Table ' || TableName ||'
( TelNo varchar2(20),
constraint idx_number primary key(TelNo)) ';
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
v_row:=dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor);
RetValue:=200;
end;
end if;
exception when others
then
RetValue:=-2500;
end;
有一个非常关键的问题是,你必须清楚:你登录到oracle数据库上的用户有没有创建表的权限? 如果没有,那么执行创建表即使你的其它的都是对的,也会出现异常而不能创建新表。因此:你必须在登录到oracle数据库服务器,PL/SQL执行 :
Grant Create Table To YourUserName // 授予权限给用户:YourUserName