Plsql 从动态PL/SQL查询返回表结果

Plsql 从动态PL/SQL查询返回表结果,plsql,Plsql,尝试动态生成和执行PL/SQL语句。它不返回结果,但执行正常。我尝试的是从第一个语句中的模式中获取表名(正确!),并将其附加到select语句中,然后执行它以返回表结果 DECLARE LATEST_TABLE VARCHAR2(256); PostalCode ADM.POSTAL_CODE_201801%ROWTYPE; BEGIN SELECT TO_CHAR(max(table_name)) INTO LATEST_TABLE FROM all_tables WHERE own

尝试动态生成和执行PL/SQL语句。它不返回结果,但执行正常。我尝试的是从第一个语句中的模式中获取表名(正确!),并将其附加到select语句中,然后执行它以返回表结果

DECLARE
  LATEST_TABLE VARCHAR2(256);
  PostalCode  ADM.POSTAL_CODE_201801%ROWTYPE;
BEGIN
SELECT TO_CHAR(max(table_name)) INTO LATEST_TABLE FROM all_tables WHERE owner = 'ADM' AND  table_name LIKE 'POSTAL_CODE_%';
LATEST_TABLE := 'begin Select POSTALCODE,LONGITUDE,LATITUDE,MUNICIPALITY_FULL_NAME,LOCAL_NAME,SZONE_NAME,ZONE_NAME,RHA_CODE,RHA_NAME,URBAN,ZONE_RURAL from ADM.'||LATEST_TABLE||' ;end;';
execute immediate LATEST_TABLE into PostalCode;
Exception
When others then
 Null; 
END;
为什么我没有得到任何结果?添加
dbms_输出.put_行(PostalCode.LONGITUDE | | PostalCode.LATITUDE)之后
立即执行
也不会生成结果

我在这里看到了几个问题;您的代码类似于:

declare
    vSQL        varchar2(1000);
    vTabName    varchar2(30);
    vResult     number;
begin
    select table_name into vTabName from user_tables;
    vSQL := 'begin select a from ' || vTabName || '; end;';
    execute immediate vSQL into vResult;
    dbms_output.put_line('REsult: ' || vResult);
exception
when others then
  null
end;
如果你运行这个,你什么也看不到,因为动态部分给出了错误,但是(危险的)异常处理隐藏了它;如果要编辑
null编码为类似

dbms_output.put_行('Error:'| | sqlerrm)

你会得到:

Error: ORA-06550: line 1, column 7:
PLS-00428: an INTO clause is expected in this SELECT statement
实际上,动态代码就像

begin select a from someTable; end;
这就产生了错误。 做你需要的事情的一种方法可以是:

...
vSQL := 'select a from ' || vTabName;
execute immediate vSQL into vResult;
...

删除异常隐藏的可能重复项,以查看失败的内容。