Oracle动态SQL多行返回
我对Oracle没有太多经验,我甚至不确定这是否可以做到。我正在尝试创建动态SQL并执行它,所讨论的SQL会导致返回多行,每行有3列。我能够很好地创建SQL语句,这是我一直坚持的执行部分。我使用的是来自的示例,但出现以下错误:Oracle动态SQL多行返回,oracle,plsql,dynamic-sql,Oracle,Plsql,Dynamic Sql,我对Oracle没有太多经验,我甚至不确定这是否可以做到。我正在尝试创建动态SQL并执行它,所讨论的SQL会导致返回多行,每行有3列。我能够很好地创建SQL语句,这是我一直坚持的执行部分。我使用的是来自的示例,但出现以下错误: Error report - ORA-00942: table or view does not exist ORA-06512: at line 41 00942. 00000 - "table or view does not exist" 根据该代码: DECL
Error report -
ORA-00942: table or view does not exist
ORA-06512: at line 41
00942. 00000 - "table or view does not exist"
根据该代码:
DECLARE thecount number;
thesql varchar2(8000);
suffix VARCHAR2(20);
finalsql varchar2(8000);
TYPE results IS TABLE OF EDW_HPM.DYNAMIC_TEMP%ROWTYPE;
results_tbl results;
CURSOR c1 is
select cast(cast(substr(p.TABLE_SUFFIX,2,20) as Number(19))as varchar2(50))
from support.data_set_phys p
where p.name not like '%UPD' and p.name like 'FY%' and p.name like '%Encounters'
and p.is_active = 1 and p.owner_id in ('001441631324','000001666805')
and NAME not like '%TEST%' and NAME not like 'old%' and NAME not like '%new%' and
NAME not like '%NEW%' and name not like '%BACK%' and name not like '%back%'
and cast(replace(substr(p.name, 1, 4),'FY', '20')as int) between 2018 and
2018 union
select cast(cast(substr(p.TABLE_SUFFIX,2,20) as Number(19))as varchar2(50))
from support.data_set_phys p
where p.name not like '%UPD' and p.name like 'EPIC HB %' and p.name like '%Encounters'
and p.is_active = 1 and p.owner_id in ('001441631324','000001666805')
and NAME not like '%TEST%' and NAME not like 'old%' and NAME not like '%new%' and
NAME not like '%NEW%' and name not like '%BACK%' and name not like '%back%'
and cast(replace(substr(p.name, 9, 4),'FY', '20')as int) between 2018 and
2018;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO suffix;
EXIT WHEN c1%NOTFOUND;
thesql := thesql ||'SELECT facility_id,patient_type_id ,count(pat_account_no) FROM encounter_' ||suffix|| ' e group by facility_id, patient_type_id union ';
END LOOP;
CLOSE c1;
finalsql :=SUBSTR(thesql,1,length(thesql)-7);
EXECUTE IMMEDIATE finalsql BULK COLLECT INTO results_tbl;
END allrows_by;
此行触发的错误:
EXECUTE IMMEDIATE finalsql BULK COLLECT INTO results_tbl;
我可以确保表EDW_HPM.DYNAMIC_TEMP确实存在,这一定是某种语法错误,或者我正在尝试一些在Oracle中不可能的事情。任何帮助都将不胜感激。您的代码比链接到的示例要复杂得多。驱动查询不仅极其复杂,而且动态语句是一个具有生成表名的并集 这一定是某种语法错误,或者我正在尝试一些在Oracle中不可能的东西 动态SQL很难实现,因为它将编译错误转化为运行时错误 我可以确保EDW_HPM.DYNAMIC_TEMP表确实存在 在本例中,可能是生成的表名抛出了ORA-00942 调试很简单:不执行语句,而是显示它
dbms_output.put_line(finalsql);
现在,如果不能立即发现错误,可以在SQL客户机中运行该语句来验证该语句
可能原因
表名的格式不正确
生成的SQL汇编不存在的表的名称
生成的名称引用不同模式中的表,并且没有同义词
生成的名称引用不同模式中的表,其中有同义词,但您的用户对这些表没有权限。
错误信息显而易见。在您的架构中没有这样的表遭遇。@KaushikNayak实际上,如果表存在,但执行PL/SQL的架构没有访问它的权限,也会收到错误消息。您可以使用dbms_output.put_行输出finalsql变量值,然后复制并运行查询finalsql值,并标识不存在的表是这样的:生成的SQL汇编了不存在的表的名称。