我有以下过程,它不能正确编译,因为它引用了不存在的对象(表不存在),这里只是代码的一部分(我使用了表和列的通用名称):
DECLARE
C INTEGER := 0;
BEGIN
SELECT COUNT(1) INTO C FROM USER_TABLES WHERE TABLE_NAME = 'MY_TABLE';
IF C > 0 THEN
DECLARE
CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE = 1;
BEGIN
FOR prec IN c_maps LOOP
some code...;
END LOOP;
EXECUTE IMMEDIATE 'some code..';
END;
END IF;
END;
/我不知道如何动态编写这条语句,因为表"MY_TABLE“并不存在:
CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE =1;我也试着写成这样:
CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM (Select 'MY_TABLE' from dual) WHERE ACTIVE = 1;然而,它引用的列"ACTIVE“也不存在于编译块中,是否可以在"execute immediate”块中写入整个过程?- time...It?我尝试过不同的变种,但是没有成功。
发布于 2017-02-08 16:57:18
您可能需要以不同的方式打开游标,以便只在动态SQL中引用不存在的表;例如:
declare
c integer := 0;
curs sys_refcursor;
v1 number;
v2 number;
begin
select count(1)
into c
from user_tables
where table_name = 'MY_TABLE';
if c > 0
then
open curs for 'select column_name1, column_name2 from my_table where active = 1';
loop
fetch curs into v1, v2;
exit when curs%NOTFOUND;
dbms_output.put_line(v1 || ' - ' || v2);
end loop;
else
dbms_output.put_line('The table does not exist');
end if;
end;
/https://stackoverflow.com/questions/42108450
复制相似问题