尝试动态生成和执行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
也未生成结果!
答案 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;
...