我用的是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
我找了很久,好像都没有类似的例子,请高人指点!

解决方案 »

  1.   

    str := 'create table'||tartable||'as select * from'||srctable||';';
    是这个要加空格吗?
    str := 'create table '||tartable||' as select * from '||srctable||';';
      

  2.   

    我看就是空格问题
    将传近的参数前后加空格或者按dongdong715方法修改
      

  3.   

    我按照你们的说法,加了空格:
    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
      

  4.   

    str := 'create table '||tartable||'as select * from '||srctable||';';看不出来还有什么错误了
    lz把str输出来看看什么样,如果把输出值贴出来执行是否可以
    dbms_output.put_line(str);
      

  5.   

    str := 'create table '||tartable||' as select * from '||srctable||';';as前面也要有空格
      

  6.   

    as前面加空格了,我现在的存储过程定义是:
    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
      

  7.   

    不好意思,能说说dbms_output.put_line(str);是怎么使用的吗?
      

  8.   


    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;--
    你先不执行,直接输出看看,估计是什么写得有问题
      

  9.   

    dbms_output.put_line(str);
    就是str输出来我一般都用toad工具
    output窗体就会把str显示出来了
      

  10.   

    如果用别的工具
    好像还要设置serveroutput参数,你可以搜索一下
    我家里没有oracle环境
    不能帮你测试
      

  11.   

    非常感谢冰,我按照你的方法修改了存储过程,然后在SQL*PLUS里面执行,显示
    PL/SQL 过程已成功完成。
    但是没有什么输出出来啊!
      

  12.   

    create or replace procedure createtable(srctable in varchar2,tartable in varchar2)
    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;
    应该可以了。
      

  13.   

    晕,重新写一遍
    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;这样应该就可以了。
      

  14.   

    谢谢stone,这样是可以了,但是我执行的时候显示“权限不足”,我用系统管理员身份登陆之后才可以执行。
    执行存储过程需要什么特殊的权限吗?
      

  15.   

    当前用户有建表权限啊,我可以在SQL*PLUS里面使用普通的sql语句建立表,但是使用存储过程的时候,就不行了,说我没有权限
      

  16.   

    那你用DBA授权给你的用户就可以了
    GRANT CREATE TABLE TO 用户,就可以了
      

  17.   

    楼主是从SQL SERVER转过来的吧,看你代码的风格颇像.建议你在熟悉了PL/SQL的语法,还需要了解下ORACLE管理,优化方面的内容,当然对体系结构有兴趣也可以慢慢看.
    一般情况下(不排除特例,比如你就是玩玩PL/SQL的语法),ORACLE都应用在大型的企业运算上,比如电信,银行等,并发事务量大,数据量,IO也是大的很.一段看上去没有任何语法错误的SQL,如果没有在性能上做出考量,有可能导致整个系统的crash.
    所以对ORACLE而言,无论管理,开发都特别注重性能,尤其对开发人员要进行相关的培训,否则一个大的应用,到处都是低效的代码,最好的DBA也只能感叹.看到你的过程里面create table,drop table,动态SQL,一般的DBA都会无法容忍.
    既然在学习ORACLE,尽量养成好的习惯与风格吧.在过程中尽量避免进行DDL,尽量避免动态SQL,尽量避免长SQL,尽量避免多表的驱动,等等.
      

  18.   

    str := 'create table '||tartable||' as select * from '||srctable||';';最后的 "|| ';'" 去掉
      

  19.   

    不好意思,我用的是sql/server,所以帮不了你
      

  20.   

    str := 'create table'||tartable||'as select * from'||srctable||';';
    改为:
    str := 'create table '||tartable||' as select * from '||srctable;execute immediate 建表需要先做这操作:
    grant create any table to 用户名;(有dba角色还不行,一定要显示赋权限!)btw: 如能解决,这帖该结了。
      

  21.   

    哈哈,我也看出来了是最后那个分号的问题....
    sqlplus里边先set serveroutput on 才能看到输出...
    很久没用oracle子,家里机器开oracle比如慢,所以不能试,
    顺便拜一下yxsalj(想和你去吹吹风) ,希望高手能多讲一讲OCP的知识啊,渴望死了...
      

  22.   

    存储过程没有权限, 是因为没有给IIS匿名用户(ISUR_开头的)设定建表的权限.