我用的是Oracle8.1.7的数据库,想写一个带参数的存储过程,传入两个表的名称,根据其中一个表来建立另一个表,但调试了好久,都通不过。create or replace procedure createtable(srctable in varchar2,tartable in varchar2)
as
str varchar2(1000);
begin
str := 'create table'||tartable||'as select * from'||srctable||';';
execute immediate str;
end;过程可以建立
调用的时候,我写的是如下语句:
declare p varchar2(100):='POINT';
s varchar2(100):='TTT';
begin
createtable(p,s);
end;但总是提示如下错误:
declare p varchar2(100):='POINT';
*
ERROR 位于第 1 行:
ORA-00901: 无效 CREATE 命令
ORA-06512: 在"SYSTEM.CREATETABLE", line 6
ORA-06512: 在line 4
我找了很久,好像都没有类似的例子,请高人指点!
as
str varchar2(1000);
begin
str := 'create table'||tartable||'as select * from'||srctable||';';
execute immediate str;
end;过程可以建立
调用的时候,我写的是如下语句:
declare p varchar2(100):='POINT';
s varchar2(100):='TTT';
begin
createtable(p,s);
end;但总是提示如下错误:
declare p varchar2(100):='POINT';
*
ERROR 位于第 1 行:
ORA-00901: 无效 CREATE 命令
ORA-06512: 在"SYSTEM.CREATETABLE", line 6
ORA-06512: 在line 4
我找了很久,好像都没有类似的例子,请高人指点!
是这个要加空格吗?
str := 'create table '||tartable||' as select * from '||srctable||';';
将传近的参数前后加空格或者按dongdong715方法修改
str := 'create table '|| tartable ||' as select * from '|| srctable ||' ;';这次再调用,错误信息不一样了,但还是出错:
declare p varchar2(100):=' POINT ';
*
ERROR 位于第 1 行:
ORA-00911: 无效字符
ORA-06512: 在"SYSTEM.CREATETABLE", line 6
ORA-06512: 在line 4
lz把str输出来看看什么样,如果把输出值贴出来执行是否可以
dbms_output.put_line(str);
create or replace procedure createtable(srctable in varchar2,tartable in varchar2)
as
str varchar2(1000);
begin
str := 'create table '||tartable||' as select * from '||srctable||';';
dbms_output.put_line(str);
execute immediate str;
end;调用的时候是:
declare p varchar2(100):='POINT';
s varchar2(100):='TTT';
begin
createtable(p,s);
end;执行结果没有输出str的内容:
declare p varchar2(100):='POINT';
*
ERROR 位于第 1 行:
ORA-00911: 无效字符
ORA-06512: 在"SYSTEM.CREATETABLE", line 7
ORA-06512: 在line 4
create or replace procedure createtable(srctable in varchar2,tartable in varchar2)
as
str varchar2(1000);
begin
str := 'create table '||tartable||' as select * from '||srctable||';';
dbms_output.put_line(str);
--execute immediate str;
end;--
你先不执行,直接输出看看,估计是什么写得有问题
就是str输出来我一般都用toad工具
output窗体就会把str显示出来了
好像还要设置serveroutput参数,你可以搜索一下
我家里没有oracle环境
不能帮你测试
PL/SQL 过程已成功完成。
但是没有什么输出出来啊!
as
str varchar2(1000);
begin
create or replace procedure createtable(srctable in varchar2,tartable in varchar2)
as
str varchar2(1000);
begin
str := 'create table '||tartable||' as select * from '||srctable||';';
dbms_output.put_line(str);
--execute immediate str;
end;
dbms_output.put_line(str);
--execute immediate str;
end;
把
str := 'create table '||tartable||' as select * from '||srctable||';';
改成
str := 'create table '||tartable||' as select * from '||srctable;
应该可以了。
create or replace procedure createtable(srctable in varchar2,tartable in varchar2)
as
str varchar2(1000);
begin
str := 'create table '||tartable||' as select * from '||srctable;
dbms_output.put_line(str);
execute immediate str;
end;这样应该就可以了。
执行存储过程需要什么特殊的权限吗?
GRANT CREATE TABLE TO 用户,就可以了
一般情况下(不排除特例,比如你就是玩玩PL/SQL的语法),ORACLE都应用在大型的企业运算上,比如电信,银行等,并发事务量大,数据量,IO也是大的很.一段看上去没有任何语法错误的SQL,如果没有在性能上做出考量,有可能导致整个系统的crash.
所以对ORACLE而言,无论管理,开发都特别注重性能,尤其对开发人员要进行相关的培训,否则一个大的应用,到处都是低效的代码,最好的DBA也只能感叹.看到你的过程里面create table,drop table,动态SQL,一般的DBA都会无法容忍.
既然在学习ORACLE,尽量养成好的习惯与风格吧.在过程中尽量避免进行DDL,尽量避免动态SQL,尽量避免长SQL,尽量避免多表的驱动,等等.
改为:
str := 'create table '||tartable||' as select * from '||srctable;execute immediate 建表需要先做这操作:
grant create any table to 用户名;(有dba角色还不行,一定要显示赋权限!)btw: 如能解决,这帖该结了。
sqlplus里边先set serveroutput on 才能看到输出...
很久没用oracle子,家里机器开oracle比如慢,所以不能试,
顺便拜一下yxsalj(想和你去吹吹风) ,希望高手能多讲一讲OCP的知识啊,渴望死了...