Oracle:在单个存储过程中将表创建为Select语句并在创建的表上选择查询

时间:2015-09-18 08:50:34

标签: oracle

我想要使用Create Table创建临时表的存储过程...选择...语句。 然后从同一个创建的表中选择记录。 最后放弃创建的表......

我想在同一存储过程中使用所有这些功能。

我创建了以下存储过程。但是我得到了以下错误

PL/SQL: ORA-00942: table or view does not exist

这是我的程序

DECLARE
TEMP_TBL VARCHAR2(4000);
TBL_NAME VARCHAR2(200) := 'ABC_TEST';

BEGIN
TEMP_TBL := 'CREATE TABLE MY_TAB_COL AS(SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,to_lob(DATA_DEFAULT) AS DATA_DEFAULT,NULLABLE FROM ALL_TAB_COLS WHERE TABLE_NAME=''' || TBL_NAME || ''')';

DBMS_OUTPUT.PUT_LINE(TEMP_TBL);
EXECUTE IMMEDIATE TEMP_TBL;

FOR DD_COLUMNS IN
(SELECT TABLE_NAME FROM MY_TAB_COL)
LOOP 
  DBMS_OUTPUT.PUT_LINE('DD_COLUMNS.TABLE_NAME');

END LOOP;
END;

1 个答案:

答案 0 :(得分:0)

我不确定您为什么要这样的场景,并且不建议在生产中使用此代码。我很确定在99%的情况下,这种方法可以用其他方式编写。但是您可以尝试下面的代码(程序中的所有内容都应该使用动态sql)

declare
   TBL_NAME varchar2(200) := 'ABC_TEST';

   lv_Sql varchar2(4000);

begin
   lv_Sql := 'CREATE TABLE MY_TAB_COL AS(SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE,to_lob(DATA_DEFAULT) AS DATA_DEFAULT,NULLABLE FROM ALL_TAB_COLS WHERE TABLE_NAME=''' ||
             TBL_NAME || ''')';

   DBMS_OUTPUT.PUT_LINE(lv_Sql);
   execute immediate lv_Sql;

   lv_Sql := 'begin
                 for DD_COLUMNS in (select TABLE_NAME from MY_TAB_COL) loop
                    DBMS_OUTPUT.PUT_LINE(DD_COLUMNS.TABLE_NAME);   
                 end loop;
              end;';

   DBMS_OUTPUT.PUT_LINE(lv_Sql);
   execute immediate lv_Sql;

   for R in (select *
               from user_objects
              where object_name = 'MY_TAB_COL'
                and object_type = 'TABLE') loop
      DBMS_OUTPUT.PUT_LINE('drop table ' || R.Object_Name);
      execute immediate 'drop table ' || R.Object_Name;
   end loop;
end;