代码:
lc_tab1_col1 VARCHAR2(4000);
lc_tab1_col2 VARCHAR2(4000);
lc_tab2_col2 VARCHAR2(4000);
lc_tab2_col2 VARCHAR2(4000);
CURSOR my_cursor IS select col1, col2 from tab1;
[...]
OPEN my_cursor;
LOOP
FETCH my_cursor INTO lc_tab1_col1, lc_tab1_col2;
EXIT WHEN my_cursor%NOTFOUND;
SELECT lc_tab1_col2.col1, lc_tab1_col2.col2 INTO lc_tab2_col2, lc_tab2_col2 FROM lc_tab1_col2 WHERE lc_tab1_col2.col3 = lc_tab1_col1;
[...]
END LOOP;
CLOSE my_cursor;
伙计们,
我正在尝试使以上代码正常工作。
我遇到的问题是SELECT INTO语句显然不支持在该语句的FROM子句中使用变量(在这种情况下为lc_tab1_col2
)作为表名。
在编译软件包时,会抛出ORA-000942(表或视图不存在),这告诉我变量是直接解释的,而不是在运行时替换和解释的。
我想不出一个临时解决方法,关于如何解决此问题的任何想法?
更多背景信息:lc_tab1_col2
包含数据库中表的名称,而lc_tab1_col1
包含ID。
此ID存在于lc_tab1_col2
中的所有表中(因此WHERE子句)。
除了ID之外,所有这些表中都存在其他两列(lc_tab1_col2.col1
和lc_tab1_col2.col2
),但tab1
中却没有。我需要选择这两个值才能在循环内使用它们。
由于要考虑许多表,因此我需要此SELECT INTO语句是动态的。一张一张地解析表是不可行的。期待与大家分享解决此问题的聪明方法:)预先感谢!
答案 0 :(得分:0)
我认为,您的例外情况确实意味着该表不存在,或者您没有选择它的特权。
我执行了以下代码,一切正常。我尝试将其编译为一个包,也没有任何编译错误
DECLARE
user_tables varchar2(30) := 'TBLCOMPANIES';
BEGIN
SELECT table_name
INTO user_tables
FROM user_tables
WHERE user_tables.table_name = user_tables;
dbms_output.put_line(user_tables) ;
END;
/