2015-07-02 25 views
2

我试图插入架构是动态的数据,就像用户输入架构名称一样。出于某种原因,我得到了ORA-000942: table doesn't exist,即使表格存在于正确的模式中。光标中的动态表名

下面是代码:

declare 
    l_ext_files_names varchar2(4000) := '&1'; 
    l_schema_name varchar2(4000) := '&2'; 
    l_table_name varchar2(4000) := l_schema_name||'.files_tbl'; 
    l_int_files_names varchar2(4000); 
    c_file_name sys_refcursor; 
begin 
    open c_file_name for 'select file_names from '||l_table_name; 
    loop 
    fetch c_file_name into l_int_files_names; 
    if (l_int_files_names <> l_ext_files_names) then 
     insert into l_table_name (file_names, status) 
     values (l_files_names, 'done'); 
    end if; 
    end loop; 
    close c_file_name; 
end; 

任何想法,我做了错误? 干杯提前:)

+0

它可能是特权问题。 –

+0

感谢您的回复。我尝试使用创建表的相同模式插入语句。插入语句很顺利。所以问题不在于特权。 – Jaanna

+0

尝试使用相同用户的select语句和'set role NONE;'如果SELECT权限是通过ROLE授予的,它将不能在PL/SQL中使用。 –

回答

0

经过一番研究和漫步通过互联网,这是我发现。看起来我需要以稍微不同的方式声明模式和表名变量。为何该解决方案有效不知道。

declare 
    l_schema_name all_tables.owner%type := '&1'; 
    l_ext_files_names varchar2(4000) := '&2'; 
    l_table_name all_tables.table_name%type := 'FILES_TBL'; 
    l_int_files_names varchar2(4000); 
    c_file_name sys_refcursor; 

begin 
    open c_file_name for 'select file_names from '||l_schema_name||'.'||l_table_name; 
    fetch c_file_name into l_int_files_names; 
    if c_file_name%notfound then 
    execute immediate 'insert into '||l_schema_name||'.'||l_table_name||' (file_names, entry, status) values ('''||l_ext_files_names||''', sysdate, ''done'')'; 
    commit; 
    elsif (l_int_files_names <> l_ext_files_names) then 
    execute immediate 'insert into '||l_schema_name||'.'||l_table_name||' (file_names, entry, status) values ('''||l_ext_files_names||''', sysdate, ''done'')'; 
    commit; 
    else 
    dbms_output.put_line ('Already there.'); 
    end if; 
exception when others then 
    dbms_output.put_line ('Some errors.'); 
end; 
/ 
0

最有可能的user没有privilege访问其它模式表。您需要授予SELECT权限。

GRANT SELECT ON table_name TO username; 

把所需table_nameusername把正在执行选择用户。