Oracle动态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

我对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"
根据该代码:

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汇编了不存在的表的名称。