PL / SQL:在FROM子句

时间:2018-11-19 13:26:36

标签: sql oracle plsql

代码:

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.col1lc_tab1_col2.col2),但tab1中却没有。我需要选择这两个值才能在循环内使用它们。

由于要考虑许多表,因此我需要此SELECT INTO语句是动态的。一张一张地解析表是不可行的。期待与大家分享解决此问题的聪明方法:)预先感谢!

1 个答案:

答案 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;
/