写了个建表的存储过程如下:
create or replace predure create table(tablename in varchar)as begin
     select * from tablename;
     create table testtable
     (
         tid number(1)
     );end predure;
提示两个错误:红色部分
第一:不能写tablename,提示表不存在,我不能通过参数动态传递表名吗?改成testtable001(已存在的表),问题解决,只能做成这么静态的形式吗?!!
第二:create错误,好像不能在存储过程中建表吗?错误原因看不懂。应该写在哪才对?请高手帮忙解决下。

解决方案 »

  1.   

    可以,用变量撒sqlstr varchar2(500);
    sqlstr:='select * from '||tablename;
    execute immediate sqlstr;第二个问题也用变量,然后执行
      

  2.   

    要是想把查到的记录集赋给游标呢?怎么做?比如
    cursor cur is select * from tablename
      

  3.   

    sqlstr:='select * from '||tablename;
    open cursor for sqlstr;
      

  4.   

    问题挺多的 :-)需要用动态SQL, 另外select出来的内容必须放到变量里面去。create or replace predure create table(tablename in varchar) 
    as 
    strfld varchar2(20);  --假设tablename里面有个字段类型为varchar2的,这个变量用来保存字段值
    sqlstr varchar2(1000);
    begin 
        sqlstr:='select field1 from '||tablename;  
        execute immediate sqlstr into strfld;  ---如果取出的记录不是1条,包括0或者>1,以上语句都会报错,加上这个异常处理就不报错了。
        exception when others then null;    sqlstr:='create table testtable(tid number(1))';
        execute immediate sqlstr into strfld; 
      
    end predure;