create or replace procedure fan_add_omgtable(intablename varchar2) is
  v_tablename varchar2(255) := intablename;
  v_errorcode number(15);
  v_errortext varchar2(255);
begin  execute immediate 'create table ' || v_tablename || '
as
SELECT * FROM ' || v_tablename || '@linkomg ;';exception
  when others then
    v_errorcode := sqlcode;
    v_errortext := substr(sqlerrm, 1, 255);
    insert into xb_errorlog
      (id, speciality, tname, originalid, errorcode, errormsg)
    values
      (s_xb_errorlog.nextval,
       2,
       v_tablename,
       null,
       v_errorcode,
       v_errortext);
    commit;
  
end;
原因在哪里?create table omgaddressas
as
SELECT * FROM omgaddress@linkomg;
试了一个单独拿出来建表都没问题的

解决方案 »

  1.   


    --动态SQL后面不要加分号!
    execute immediate 'create table ' || v_tablename || '
    as
    SELECT * FROM ' || v_tablename || '@linkomg '; 
      

  2.   

    1,动态SQL里面肯定是不要使用分号的。
    2,参数intablename可以直接使用,不用转存到变量v_tablename;
    3,v_tablename varchar2(255) := intablename 写在申明的位置,是否有问题,这块我没有验证,你可以看看,我们通常这样写。
    declare
    v_tablename varchar2(255);
    begin
    v_tablename:= intablename;
      

  3.   


    execute immediate 'create table ' || v_tablename || '
    as SELECT * FROM ' || v_tablename || '@linkomg ;';  --你的拼接里面多了分号
    execute immediate 'create table ' || v_tablename || '
    as SELECT * FROM ' || v_tablename || '@linkomg ';