【问题标题】:Oracle stored procedure using temp tables使用临时表的 Oracle 存储过程
【发布时间】:2015-02-15 20:10:04
【问题描述】:

主要思想:我想用一些选择创建 3 个表(作为临时表),取 1 和 2 并进行比较。

结果插入到 3 个表。

我的程序如下:

create or replace PROCEDURE CHECK_PARAMS
AS 
TYPE row IS RECORD (id NUMBER,         
                    count_id NUMBER ); 
TYPE my_table_type IS TABLE OF row;

first my_table_type;
second my_table_type;
third my_table_type;    
BEGIN
  SELECT id, count_id bulk collect -- GOOD SELECT
  INTO first
  FROM 
    (SELECT test1.A_ID id, 
            COUNT(test1.A_ID) count_id
     FROM MY_OTHER_TABLE1 test1, 
          MY_OTHER_TABLE2 test2
     WHERE test1.A_ID = test2.A_ID
     GROUP BY test1.A_ID);

  SELECT id, count_id bulk collect -- GOOD SELECT
  INTO first
  FROM 
    (SELECT test1.A_ID id, 
            COUNT(test1.A_ID) count_id
     FROM MY_OTHER_TABLE3 test1, 
          MY_OTHER_TABLE4 test2
     WHERE test1.A_ID = test2.A_ID
     GROUP BY test1.A_ID);

  SELECT id, count_id bulk collect -- ORACLE CAN'T FIND MY TEMP TABLES
  INTO third
  FROM frist, second; -- **HERE I GOT ERROR: ORA-00942 table or view does not exist**

怎么了?

【问题讨论】:

  • 一个问题是您在最终选择中有一个错字。你有FROM frist 而不是FROM first

标签: sql oracle stored-procedures plsql temp-tables


【解决方案1】:

你必须在过程之外定义类型

create TYPE t_row as object  (id NUMBER,         
                    count_id NUMBER ); 

create TYPE my_table_type IS TABLE OF t_row;

你必须使用table

SELECT id, count_id bulk collect -- ORACLE CAN'T FIND MY TEMP TABLES
  INTO third
  FROM table(first), table(second);

【讨论】:

  • 如果我不想创建新类型。我们有其他变种吗?我需要将一些选择保存到局部变量。游标呢?
  • 我会把整个事情写到一个 select 语句中。如果中间没有步骤,就没有理由多做一个声明。
  • 是的,我做到了,但我想解决这个问题以便下次理解和使用。下一次是现在)
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2015-12-11
  • 2014-12-22
相关资源
最近更新 更多