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

时间:2018-07-21 02:17:19

标签: 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 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_output.put_line(PostalCode.LONGITUDE || PostalCode.LATITUDE);之后的execute immediate也未生成结果!

1 个答案:

答案 0 :(得分:1)

我在这里看到了几个问题;您的代码如下:

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_line('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;
...