我的包中有一个execute immediate,当v_object_name
类似于20200823_AGL时,我会得到以下错误:
ORA-00903:无效的表名
如何修复它?
EXECUTE IMMEDIATE 'SELECT MAX(LAST_UPDATE),COUNT(*) FROM ' || v_object_name || ''
INTO v_max_update_date,
v_count;
来自Oracle文档:模式对象名称和限定符
未引用的标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任何字符开头。
EXECUTE IMMEDIATE 'SELECT MAX(LAST_UPDATE),COUNT(*) FROM "' || v_object_name || '"'
INTO v_max_update_date,
v_count;
一个更完整的例子:
declare
v_object_name char(12) := '20200823_AGL';
v_count pls_integer;
begin
execute immediate 'select count(*) from "' || v_object_name || '"'
into v_count;
--
DBMS_OUTPUT.PUT_LINE('v_count = ' || v_count);
end;
这样的对象可能是使用双引号创建的。
create view "1_test_view" as select 1 col_name from dual; --> ORA-00999: invalid view name
create view "1_test_view" as select 1 col_name from dual: --> works fine
表格的规则相同
在这种情况下,您需要使用双引号以及从这些对象进行查询
select * from 1_test_view; --> ORA-00903: Invalid table name
select * from "1_test_view"; --> will work fine